2020杭电多校第二场 1006.The Oculus

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

猜你喜欢

转载自www.cnblogs.com/2462478392Lee/p/13374199.html