C. Product 1 Modulo N
https://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)。它满足一系列类似等式的运算定律,同时也有自身的特殊规则,具体分类如下:
一、 基本等价定律(同余关系的性质)
同余本质是一种等价关系,满足以下三条基本定律:
- 自反性对任意整数 a,有 a≡a (mod n)。例:5≡5 (mod 3)。
- 对称性若 a≡b (mod n),则 b≡a (mod n)。例:若 7≡1 (mod 6),则 1≡7 (mod 6)。
- 传递性若 a≡b (mod n) 且 b≡c (mod n),则 a≡c (mod n)。例:10≡4 (mod 6),4≡-2 (mod 6),则 10≡-2 (mod 6)。
二、 四则运算定律(同余的运算封闭性)
同余对加、减、乘运算完全封闭,对除法有条件封闭,具体规则如下:
- 加法定律若 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)。
- 减法定律若 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)。
- 乘法定律若 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)。
- 除法定律(有条件)同余的除法不满足无条件封闭,核心规则为:若 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)。
三、 其他常用推论
- 若 a≡b (mod n),则 k×a≡k×b (mod k×n)(k 为正整数)。
- 若 a≡b (mod n),d 是 a,b,n 的公因数,则 a/d≡b/d (mod n/d)。
- 若 a≡b (mod n1) 且 a≡b (mod n2),且 gcd (n1,n2)=1,则 a≡b (mod n1×n2)(中国剩余定理的基础)。