题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6768
题意:多个测试样例,接下来三行,每行首先输出n,代表斐波那契数列长度,1代表取这一位的值,0不取。以样例来说 A=f[1]+f[3],B=f[4],C=f[2]+f[6]。原本有A*B=C ,但现在改变了C斐波那契数列中的一位,使其由原本的1变为0。我们的目的就是找到这一位。
思路:这道题就是签到题。。。读不懂英文题面,半天没看懂,读懂了超简单。其实就是A*B=C+f[i] ,i就是被改变的那一位。由于 a * b溢出,所以要同余。我没取模,自然溢出也a了,题解说 取MOD = 2^64,我猜是因为unsigned long long [int] 64 0 ~ 2^64-1(signed long long [int] 64 -2^63 ~ 2^63-1 %I64d)。
#include #include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll; using namespace std; const int maxn=2e6+5; ll f[maxn]; void init() { f[1]=1;f[2]=2; for(int i=3;i<=maxn;i++) { f[i]=f[i-1]+f[i-2]; } } int main() { init(); ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int t;cin >> t; while(t--) { int n1,n2,n3;ll A=0,B=0,C=0; cin >> n1; for(int i=1;i<=n1;i++) { int d;cin >> d; if(d) A=A+f[i]; } cin >> n2; for(int i=1;i<=n2;i++) { int d;cin >> d; if(d) B=B+f[i]; } cin >> n3; for(int i=1;i<=n3;i++) { int d;cin >> d; if(d) C=C+f[i]; } ll temp=A*B; ll ans=temp-C; for(int i=1;i<=n3;i++) { if(f[i]==ans) cout << i << endl; } } return 0; }