2020杭电多校第二场 1006.The Oculus
Posted 2462478392lee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于2020杭电多校第二场 1006.The Oculus的主要内容,如果未能解决你的问题,请参考以下文章
[2020杭电多校第二场]1005 New Equipments(费用流)
2022杭电多校第二场 A.Static Query on Tree(树剖)