想起了前天和我娇妻深情对唱凉凉,结果这两天真的透心凉,再也没有水题给我们做了。
今早上大家集体爆0,然后在我wa+TLE了8发之后,上帝终于被我奋取的精神感动了,给了我一个accepted.
这道题就是斐波拉契数列+快速幂取和+循环节点的计算,首先如果出现f[i]=f[1]&&f[i-1]=f[0]则出现循环,
而对n的模数只有n种可能,故n^2内便出现循环。
故,先求出循环节M,
再求a^b%M,快速幂即可
#include <iostream> #include<map> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<set> using namespace std; int f[1020100]; int quickpow(unsigned long long a,unsigned long long b,int n) { unsigned long long ans=1,base=a; while(b) { if(b%2==1) { ans=(ans*base)%n; } base=(base*base)%n; b=b>>1; } return ans; } int main() { int t,m; int n; f[0]=0; f[1]=1; unsigned long long a,b; scanf("%d",&m); while(m--) { scanf("%llu%llu%d",&a,&b,&n); if(n==1||a==0) { printf("0 "); continue; } for(int i=2; i<=n*n; i++) { f[i]=(f[i-1]%n+f[i-2]%n)%n; if(f[i-1]==0&&f[i]==1) { t=i-1; break; } } printf("%d ",f[quickpow(a%t,b,t)]); } return 0; }
下一道题:
这个题就是对容器的使用,然后注意比较的时候要全部转换成小写字母比较,然后它输出的时候,又要按照字母顺序先输出大写再输出小写,所以还要用一个容器存取它本来的大小写。
#include <iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<map> #include<vector> using namespace std; map<string,int> kepa; vector<string> t1,t2; int main() { string s; int i,j; while(cin>>s) { if(s[0]=='#') break; t1.push_back(s); int len=s.length(); for(i=0; i<len; i++) { if(s[i]>='A'&&s[i]<='Z') { s[i]+=32; } } sort(s.begin(),s.end()); kepa[s]++; } for(i=0; i<t1.size(); i++) { string s1=t1[i]; for(j=0; j<s1.length(); j++) { if(s1[j]>='A'&&s1[j]<='Z') { s1[j]+=32; } } sort(s1.begin(),s1.end()); if(kepa[s1]==1) { t2.push_back(t1[i]); } } sort(t2.begin(),t2.end()); for(i=0; i<t2.size(); i++) { cout<<t2[i]<<endl; } return 0; }
水逆退散!阿门!