zoukankan      html  css  js  c++  java
  • 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
    ",i);
                    break;
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    相机
    播放音乐
    录音
    NSURLConnection下载
    UITableView
    UIPageControl
    UIScrollView
    ajax禁止浏览器缓存
    java替换word2003
    退出登录
  • 原文地址:https://www.cnblogs.com/2462478392Lee/p/13374199.html
Copyright © 2011-2022 走看看