1. 程式人生 > 實用技巧 >HDU 6768 The Oculus

HDU 6768 The Oculus

The Oculus

問題描述:

A=∑ai*F[i] B=∑bi*F[i]

C=A*B=∑ci*F[i]

F[i]是斐波拉契序列,a[],b[],c[]是給的01陣列。

由於故意將c[i]的一個數由1變成了0,現在改變的下標是

吐槽(沒啥好講的,知道迴圈節直接出)

這道題我真的我當時為什麼不看啦!!!!!!

我上一場做了一個斐波拉契的題找過迴圈節1e9+9的1重複在16666..反正超過給定陣列大小。

然後A*B=C那麼我們只要先把A B C的值取模1e9+9,在迴圈c陣列長度把0換成1一個個試。相等輸出就完事了

我下來補題直接就過了。。好心傷。。。哎。

程式碼:

#include<bits/stdc++.h>
using
namespace std; typedef long long ll; const int N = 2e6+10; ll f[N]; int C[N]; const int mod = 1e9+9; int main(){ int t,n,m,z; f[0]=f[1]=1; for(int i=2;i<N-5;i++){ f[i]=(f[i-1]+f[i-2])%mod; } scanf("%d",&t); while(t--){ ll a=0,b=0,c=0; int p; scanf(
"%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&p); if(p) a=(a+f[i])%mod; } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d",&p); if(p) b=(b+f[i])%mod; } scanf("%d",&z); for
(int i=1;i<=z;i++){ scanf("%d",&p); C[i]=p; if(p) c=(c+f[i])%mod; } a=a*b%mod; int pos=0; for(int i=1;i<=z;i++){ if(C[i]==0){ if(a==(c+f[i])%mod){ pos=i; break; } } } printf("%d\n",pos); } }