标签:namespace break ret a* int scan acm ons php
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6768
题意:每个数可以化成斐波那契数列的形式,数列第i项为bi*Fi,bi等于0或1,且对于所有的i,bi*bi+1=0。
给你两个b数列A和B,以及一个b数列C,C数列是A和B的乘积修改第k位的1变成0形成的,求k。
例如数列A为1 0 1,B数列为0 0 0 1,A,B代表的数分别为4和5,C数列为0 1 0 0 0 1,因为4*5=20,所以修改了第四位的1变成0。
思路:因为很容易得出A*B=C+Fk。所以Fk=C-A*B,主要问题是在于要找一个模数,使得几百万项的斐波那契数不重复,2^64是个很好的选择,而且直接用ull就行,不需要取模。
#include<bits/stdc++.h> using namespace std; const int maxn=2000000+100; typedef unsigned long long ull; int t,n; int c[maxn]; ull f[maxn]; ull a,b,ans; int main() { scanf("%d",&t); f[1]=1,f[2]=2; for(int i=3;i<maxn;i++)f[i]=f[i-1]+f[i-2]; while(t--) { a=b=0; int x; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); a+=x*f[i]; } scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); b+=x*f[i]; } ans=a*b; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&x); c[i]=x; ans-=x*f[i]; } for(int i=1;i<=n;i++)if(c[i]==0) { if(ans==f[i]) { printf("%d\n",i); break; } } } return 0; }
标签:namespace break ret a* int scan acm ons php
原文地址:https://www.cnblogs.com/2462478392Lee/p/13374199.html