-
描述
-
大家都知道AC_mm比较喜欢玩游戏,特别是擅长war3这款经典游戏。某天AC_mm来到了VS平台上 ,准备去虐菜鸟,正巧一个不小心将我们ACM队长虐了 ^_^,我们的队长这下可不高兴了,说要出一道难题让AC_mm难堪一下。题目描述是这样的,给一个正整数n,n在二进制表示的情况下(不含前导0和符号位)有a个1和b个0,求斐波拉契数列的第a*b项对1314520取模后的值ans。
注意(斐波拉契数列: f[0]=1,f[1]=1; f[n]=f[n-1]+f[n-2] ; n>=2;)
-
输入
-
输入:有多组测试数据,输入一个正整数n(n<1000000000);
输出
- 输出:ans的值 样例输入
-
12 6
样例输出
-
5 2
当作大数相加、大数取余模版
大数取余这部分一开始写错了。。。。详见代码把
#include<stdio.h> #include<math.h> #include<string> #include<iostream> #include<algorithm> using namespace std; string s[260]; int l; void add(string ss1,string ss2) { if(l>250) return; string ss3=ss2; int i; int temp,v=0; reverse(ss1.begin(),ss1.end()); reverse(ss2.begin(),ss2.end()); for(i=0; i<ss1.size(); i++) { temp=(ss1[i]-'0')+(ss2[i]-'0')+v; ss2[i]=(char)temp%10+'0'; v=temp/10; } for(i=ss1.size(); i<ss2.size(); i++) { temp=ss2[i]-'0'+v; ss2[i]=(char)temp%10+'0'; v=temp/10; } if(v!=0) ss2+=(char)v+'0'; reverse(ss2.begin(),ss2.end()); s[l++]=ss2; add(ss3,ss2); } int cal(int n) { int cnta=0,cntb=0; while(n) { if(n%2==1) cnta++; else cntb++; n/=2; } return cnta*cntb; } int qumo(int k) { int i,j,x=0; for(i=0;i<s[k].size();i++) { x=x*10+(s[k][i]-'0'); for(j=0;j<11;j++) { if(j*1314520>x) { x=x-(j-1)*1314520; break; } } } return x; } int main() { int i,n,ans,aa; s[0]="1"; s[1]="1"; l=2; add("1","1"); while(~scanf("%d",&n)) { ans=cal(n); aa=qumo(ans); printf("%d\n",aa); } return 0; }
-
输入:有多组测试数据,输入一个正整数n(n<1000000000);
大数相加-大数取余-nyoj-AC_mm玩dota
最新推荐文章于 2021-10-09 14:43:49 发布