题目链接: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;
}