bzoj1406【数论】

来源:互联网 发布:南光坊天海 知乎 编辑:程序博客网 时间:2024/05/19 04:06
#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<cstring>using namespace std;typedef long long LL;inline int read(){int x=0;bool f=0;char c=getchar();for (;c<'0'||c>'9';c=getchar()) f=c=='-'?1:0;for (;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';return f?-x:x;}LL n,ans[10010],val[50],k[50];int num[50],np[50],pow[50],m=0,cnt=0;inline LL qpower(LL a,LL k,LL mod){LL rec=1;while (k){if (k&1) rec=rec*a%mod;a=a*a%mod;k>>=1;}return rec;}void split(){LL nn=n;for (LL i=2;i*i<=n;i++) if (n%i==0){num[++m]=i;np[m]=i;pow[m]=1;n/=i;while (n%i==0) n/=i,np[m]*=i,pow[m]++;}if (n>1) num[++m]=n,np[m]=n,pow[m]=1;n=nn;for (int i=1;i<=m;i++){LL ki=n/np[i];k[i]=ki*qpower(ki,np[i]-np[i]/num[i]-1,np[i])%n;}}void dfs(int d){if (d<=m){if (num[d]==2){if (pow[d]==1) val[d]=1,dfs(d+1);else if (pow[d]==2) val[d]=1,dfs(d+1),val[d]=3,dfs(d+1);else val[d]=1,dfs(d+1), val[d]=(np[d]>>1)-1,dfs(d+1), val[d]=(np[d]>>1)+1,dfs(d+1), val[d]=np[d]-1,dfs(d+1);}else val[d]=1,dfs(d+1),val[d]=np[d]-1,dfs(d+1);}else{LL rec=0;for (int i=1;i<=m;i++)rec=(rec+k[i]*val[i])%n;ans[++cnt]=rec;}}int main(){n=read();if (n==1) return puts("1"),0;split();dfs(1);sort(ans+1,ans+cnt+1);for (int i=1;i<=cnt;i++) printf("%lld\n",ans[i]);return 0;}

0 0
原创粉丝点击