C. Product 1 Modulo N
题目大意
给你一个数要求让你从1到n-1中尽可能多的取数使得乘积模n等于1
思路
你只能那和n互质的数,否则在模n时,其取模结果不会为1,gcd(p%n,n)=gcd(p,n),也就是如果n和k*n+1互质的话,那么,存在一个数都能被这两个数整除,那么这个数一定是1,所以你只需要取与n互质的数放到序列中,但是有可能这个乘积模n不是1,那么你将这个不是1的余数在原序列中删除,就可以的到答案,为什么呢,你除去的这个余数相当于相当于整除余数本身,由于整除本身是1,所以得到取模后的结果一定为1
通过代码
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define debug(a) cout<<a<<"??"
#define me(a) memset(a,0,sizeof(a))
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define ph push
#define pi pair<ll,ll>
#define fi first
#define se second
const ll mod = 1e9+7;
using namespace std;
ll a[100010];
int main(){
ll n,q=1;
sl(n);
for(ll i=1;i<n;i++){
if(__gcd(i,n)==1){
a[i]=1;
q=i*q%n;
}
}
if(q!=1)a[q]=0;
cout<<count(a+1,a+n,1);
pE;
for(ll i=1;i<n;i++)if(a[i]==1)cout<<i<<' ';
return 0;
}