http://acm.hdu.edu.cn/showproblem.php?pid=6768
看到只差了一位,也就是一个fibonacci数,也就是a*b-c=f_k,那么只要找到这个fk就行了
那么直接hash就行了,搞两个取模,基本冲突不了,加了读入优化2s过,其实可以换unordered_map更快一些,但是不能映射pair,需要手动把两个数字拼成long long。也可直接扫一遍找
#include<bits/stdc++.h>
using namespace std;
namespace FastIO {
const int SIZE = 1 << 16;
char buf[SIZE], obuf[SIZE], str[60];
int bi = SIZE, bn = SIZE, opt;
int read(char *s) {
while (bn) {
for (; bi < bn && buf[bi] <= ' '; bi++);
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
int sn = 0;
while (bn) {
for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi];
if (bi < bn) break;
bn = fread(buf, 1, SIZE, stdin);
bi = 0;
}
s[sn] = 0;
return sn;
}
bool rd(int& x) {
int n = read(str), bf;
if (!n) return 0;
int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1;
for (x = 0; i < n; i++) x = x * 10 + str[i] - '0';
if (bf < 0) x = -x;
return 1;
}
};
using namespace FastIO;
typedef long long ll;
const int maxl=2e6+10;
const int mod1=1e9+9;
const int mod2=1423333;
int alen,blen,clen,k;
int a[maxl],b[maxl],f1[maxl],f2[maxl],c[maxl];
int a1,a2,b1,b2,c1,c2;
typedef pair<int,int> p;
map <p,int> mp;
inline void prework()
{
a1=a2=b1=b2=c1=c2=0;
//scanf("%d",&alen);
rd(alen);
for(int i=1;i<=alen;i++)
{
rd(a[i]);
if(a[i])
a1=(a1+f1[i])%mod1,a2=(a2+f2[i])%mod2;
}
rd(blen);
for(int i=1;i<=blen;i++)
{
rd(b[i]);
if(b[i])
b1=(b1+f1[i])%mod1,b2=(b2+f2[i])%mod2;
}
rd(clen);
for(int i=1;i<=clen;i++)
{
rd(c[i]);
if(c[i])
c1=(c1+f1[i])%mod1,c2=(c2+f2[i])%mod2;
}
}
inline void mainwork()
{
ll d1=1ll*a1*b1%mod1,d2=1ll*a2*b2%mod2;
ll e1=((d1-c1)%mod1+mod1)%mod1;
ll e2=((d2-c2)%mod2+mod2)%mod2;
k=mp[{e1,e2}];
}
inline void print()
{
printf("%d\n",k);
}
int main()
{
f1[1]=1;f1[2]=2;f2[1]=1;f2[2]=2;
mp[{1,1}]=1;mp[{2,2}]=2;
for(int i=3;i<maxl;i++)
{
f1[i]=(f1[i-1]+f1[i-2])%mod1;
f2[i]=(f2[i-1]+f2[i-2])%mod2;
mp[{f1[i],f2[i]}]=i;
}
int t;
//scanf("%d",&t);
rd(t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}