Bzoj-1406 密码箱(思维题)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bzoj-1406 密码箱(思维题)相关的知识,希望对你有一定的参考价值。
设答案为x[i],则x[i]^2-1=kn(n-2>=k>=1)
转换一下得 (x[i]+1)(x[i]-1)=kn
接着预处理出因数,再枚举一下x就可以过了qwq...
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 #include<vector> 6 #include<map> 7 #include<queue> 8 #include<algorithm> 9 using namespace std; 10 #define ll long long 11 void read(int &x){ 12 x=0;int f=1;char ch=getchar(); 13 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 14 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 15 x*=f; 16 } 17 vector<int> ans; 18 int n,s[44725],top; 19 int main(){ 20 read(n); 21 for(int i=1;i*i<=n;i++) if((n%i)==0) s[++top]=n/i; 22 while(top){ 23 int now=s[top--]; 24 for(int i=now;i<=n;i+=now){ 25 if(((i-2)%(n/now))==0) ans.push_back(i-1); 26 if(((i+2)%(n/now))==0) ans.push_back(i+1); 27 } 28 } 29 sort(ans.begin(),ans.end()); 30 int count=unique(ans.begin(),ans.end())-ans.begin(); 31 puts("1"); 32 for(int i=0;i<count;i++) if(ans[i]>1&&ans[i]<n)printf("%d\n",ans[i]); 33 }
不过这个while(top)为什么不能写成while(top--)然后省去now==
以上是关于Bzoj-1406 密码箱(思维题)的主要内容,如果未能解决你的问题,请参考以下文章