模拟赛 c2-C product
题目描述
给定⼀个整数 。现在从 中选出若⼲个互不相同的整数,使它们的乘积模 等于 。
在满⾜条件的⽅案中,要使选出的整数尽量多。
请输出最多能选多少个整数,并输出⼀种⽅案。⽅案中的整数应按从⼩到⼤的顺序排列。
输⼊格式
⼀⾏⼀个整数 。
输出格式
第⼀⾏⼀个整数 ,表示最多能选出的整数数量。
第⼆⾏输出 个互不相同的整数,按从⼩到⼤的顺序排列。
样例 1
输⼊:
12
输出:
4
1 5 7 11
样例二
输入:
9
输出:
5
1 2 4 5 7
数据范围
\(2 \le n \le 10^5\)
算法分析
首先暴力dfs是不行的,会TLE。
经过一番观察,得出可以用逆元,处理一番后,得出了一下思路:
先算出1~n中有多少个数与n互质,记录下来,从小到大进行排序
然后如果这几个数的乘积模n为1,就输出这几个数。否则就不输出最后一个数,输出其他数。(语文不好)
AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
int k = 0;
int cnt = 0;
int a[100005];
long long sum = 1;
int main(){
cin>>n;
for(int i = 1; i<n; i++){
if(__gcd(i,n)==1){
cnt++;
sum = sum*i%n;
a[++k] = i;
}
}
if(sum==1){
cout<<cnt<<'\n';
for(int i = 1; i<=cnt; i++){
cout<<a[i]<<" ";
}
}else{
cout<<cnt-1<<'\n';
for(int i = 1; i<cnt; i++){
cout<<a[i]<<" ";
}
}
return 0;
}

浙公网安备 33010602011771号