杭电多校round2 The Oculus

问题描述

让我们定义Fibonacci序列F1,F2,…为F1=1,F2=2,Fi=Fi−1+Fi−2(i≥3)。
众所周知,每个正整数x都有其独特的Fibonacci表示(b1,b2,…,bn),因此:
·b1×F1+b2×F2+⋯+bn×Fn=x。
·bn=1,对于每个i(1≤i<n),bi∈{0,1}始终成立。
·对于每个i(1≤i<n),bi×bi+1=0始终有效。
例如,4=(1,0,1),5=(0,0,0,1),和20=(0,1,0,1,0,1),因为20=F2+F4+F6=2+5+13。
有两个正整数A和B用Fibonacci表示,Skywalkert计算A和B的乘积,并将结果C写成Fibonacci表示。假设C的Fibonacci表示是(b1,b2,…,bn),小Q然后选择一个位k(1≤k<n),使得bk=1并将bk修改为0。
对于Skywalkert来说,使用快速傅立叶变换和繁琐的简化来重新计算正确的结果是如此缓慢。请帮助Skywalkert查找修改的位k。

输入

输入的第一行包含单个整数T(1≤T≤10000),即测试用例的数量。
对于每种情况,输入的第一行包含A的Fibonacci表示,第二行包含B的Fibonacci表示,第三行包含修改后的C的Fibonacci表示。
每行以一个整数n开头,表示Fibonacci表示的长度,后跟n个整数b1、b2、…、bn,表示每一位的值。
保证:
·1≤| A |,| B |≤1000000。
·2≤| C |≤| A |+| B |+1。
·∑| A |,∑| B |≤500万。

输出

对于每个测试用例,输出一行包含一个整数k的值。

思路

这题就尴尬,花里胡哨的想了半天结果直接暴力就过了。啊这

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e6+10,M=4e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
ll t,f[N];
int main() {
scanf("%d",&t);
f[1]=1;
f[2]=2;
for(int i=3;i<N;i++)
f[i]=f[i-1]+f[i-2];
while(t--){
 int n,a;
 ll A=0,B=0,C=0; 
 scanf("%d",&n);
 for(int i=1;i<=n;i++){
  scanf("%d",&a);
  if(a==1)A+=f[i];
 }
 scanf("%d",&n);
 for(int i=1;i<=n;i++){
  scanf("%d",&a);
  if(a==1)B+=f[i];
 }
 scanf("%d",&n);
 for(int i=1;i<=n;i++){
  scanf("%d",&a);
  if(a==1)C+=f[i];
 }
 A*=B;
 int i;
 for(i=1;f[i]+C!=A;i++);
 printf("%d\n",i);
 
} 
}

猜你喜欢

转载自blog.csdn.net/Nefeertari/article/details/107560923