C. Product 1 Modulo N(同余)

C. Product 1 Modulo Nhttps://codeforces.com/contest/1514/problem/C

题目:

给定一个整数 n,请找出序列最长子序列 ,满足该子序列中所有元素的乘积模 n 等于 1

思路:

假设最终答案的子序列内所有元素的乘积是t,那么就是要保证t%n=1

我们要联想到这个公式:gcd(a,b)=gcd(a%b,b)

令a=t,b=n,如果gcd(t,n)!=1那么gcd(t%n,n)!=1,那么t%n!=1(因为如果t%n=1,那么gcd(t%n,n)必等于1),不符合条件,所以gcd(t,n)=1,也就意味着子序列中的任一数都与n互质,否则gcd(t,n)!=1

现在我们知道子序列中的数都与n互质,假设在1-n-1中全部与n互质的数的乘积为p

记p%n=k

如果k==1,那么直接输出全部与n互质的数即可

否则 输出除k之外的与n互质的数

这需要证明两个地方

1,k在子序列中

要证明这个,只需证明k<n,且k与n互质即可,而k<n,显而易见无需证明,只需证明k与n互质即可

还是要用到上面那个式子gcd(a,b)=gcd(a%b,b)

此时令a=p,b=n

那么gcd(p,n)=gcd(p%n,n)=gcd(k,n)=1,证毕

2,(p/k)%n=1

两种证明方式

1同余运算

因为,两边同除k,得到,因为k与n互质,所以,所以

2思维推导

首先我们知道有这么一个公式**(a%n*b%n)%n=(a*b)%n**

乘积p可以拆分成k与除k外其他与n互质的数的乘积,简写成p=k*g 令a=k,b=g,那么(k*g)%n=((k%n)*(g%n))%n,我们又知道(k*g)%n=k,k%n=k,所以k=(k*(g%n))%n

此时g%n等于x*n+1(x属于任意整数,可以*进去看看,(k*x*n+k)%n=k),所以g%n=1,也就是(p/k)%n=1

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
// priority_queue<int, vector<int>, greater<int> > Q;
typedef pair<int,int> PII;
const int N = 4e5+10;
const int inf=1e9;
void solve() {
    int n;cin >> n;
    vector<int>a;
    int t=1;
    for (int i=1;i<n;i++) {
        if(gcd(i,n)==1) {
            a.push_back(i);
            t*=i;
            t%=n;
        }
    }
    if (n==1) {
        cout << 1 << endl << 1 << endl;
        return ;
    }
    if (t%n==1) {
        cout << a.size() << endl;
        for (auto x:a) {
            cout << x << ' ';
        }
        cout << endl;
    }else {
        cout << a.size()-1 << endl;
        for (int i=0;i<a.size()-1;i++) {
            cout << a[i] << ' ';
        }
        cout << endl;
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q=1;
    // cin >> q;
    while (q--) {
        solve();
    }
    return 0;
}

同余的运算定律

同余是数论中的核心概念,给定正整数 n,若 a-b 是 n 的整数倍,则称 a 与 b 模 n 同余,记为 a≡b (mod n)。它满足一系列类似等式的运算定律,同时也有自身的特殊规则,具体分类如下:

一、 基本等价定律(同余关系的性质)

同余本质是一种等价关系,满足以下三条基本定律:

  1. 自反性对任意整数 a,有 a≡a (mod n)。例:5≡5 (mod 3)。
  2. 对称性若 a≡b (mod n),则 b≡a (mod n)。例:若 7≡1 (mod 6),则 1≡7 (mod 6)。
  3. 传递性若 a≡b (mod n) 且 b≡c (mod n),则 a≡c (mod n)。例:10≡4 (mod 6),4≡-2 (mod 6),则 10≡-2 (mod 6)。

二、 四则运算定律(同余的运算封闭性)

同余对加、减、乘运算完全封闭,对除法有条件封闭,具体规则如下:

  1. 加法定律若 a≡b (mod n),c≡d (mod n),则 a+c≡b+d (mod n)。推论:a+c≡b+c (mod n)(c=d 的特殊情况)。例:3≡1 (mod 2),5≡1 (mod 2),则 3+5≡1+1 (mod 2),即 8≡2 (mod 2)。
  2. 减法定律若 a≡b (mod n),c≡d (mod n),则 a-c≡b-d (mod n)。推论:a-c≡b-c (mod n)。例:9≡3 (mod 6),4≡1 (mod 6),则 9-4≡3-1 (mod 6),即 5≡2 (mod 6)。
  3. 乘法定律若 a≡b (mod n),c≡d (mod n),则 a×c≡b×d (mod n)。推论 1:a×c≡b×c (mod n)。推论 2(幂运算):a^k≡b^k (mod n)(k 为正整数)。例:2≡5 (mod 3),则 2^3≡5^3 (mod 3),即 8≡125 (mod 3)。
  4. 除法定律(有条件)同余的除法不满足无条件封闭,核心规则为:若 a×c≡b×c (mod n),则 a≡b (mod n/gcd (c,n))。特殊情况(消去律):若 gcd (c,n)=1(c 与 n 互质),则 a≡b (mod n)。例:6×2≡ 3×2 (mod 6) → 12≡6 (mod 6),gcd (2,6)=2,则 6≡3 (mod 6/2) → 6≡3 (mod 3)。

三、 其他常用推论

  1. 若 a≡b (mod n),则 k×a≡k×b (mod k×n)(k 为正整数)。
  2. 若 a≡b (mod n),d 是 a,b,n 的公因数,则 a/d≡b/d (mod n/d)。
  3. 若 a≡b (mod n1) 且 a≡b (mod n2),且 gcd (n1,n2)=1,则 a≡b (mod n1×n2)(中国剩余定理的基础)。
相关推荐
NAGNIP2 小时前
万字长文!回归模型最全讲解!
算法·面试
知乎的哥廷根数学学派2 小时前
面向可信机械故障诊断的自适应置信度惩罚深度校准算法(Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习·矩阵
666HZ6664 小时前
数据结构2.0 线性表
c语言·数据结构·算法
实心儿儿5 小时前
Linux —— 基础开发工具5
linux·运维·算法
charlie1145141915 小时前
嵌入式的现代C++教程——constexpr与设计技巧
开发语言·c++·笔记·单片机·学习·算法·嵌入式
清木铎7 小时前
leetcode_day4_筑基期_《绝境求生》
算法
清木铎7 小时前
leetcode_day10_筑基期_《绝境求生》
算法
j_jiajia7 小时前
(一)人工智能算法之监督学习——KNN
人工智能·学习·算法
源代码•宸7 小时前
Golang语法进阶(协程池、反射)
开发语言·经验分享·后端·算法·golang·反射·协程池
Jasmine_llq9 小时前
《CF280C Game on Tree》
数据结构·算法·邻接表·深度优先搜索(dfs)·树的遍历 + 线性累加统计