gibonacci
题目:这题这恶心了
我比较作死,取模的时候搞了个****
代码是这样的
#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;
int why()
{
fclose(stdin);
fclose(stdout);
return 0;
}
int main()
{
freopen("gibonacci.in","r",stdin);
freopen("gibonacci.out","w",stdout);
g1[0]=g2[1]=1;
g1[1]=g2[0]=0;
int t,k=2;
scanf("%d",&t);
for(;t;t--)
{
int i,Gi,j;
scanf("%d%d%d",&i,&Gi,&j);
if(j<0){printf("-1");continue;}
for(;k<=max(i,j);k++)
g1[k]=((g1[k-1]+g1[k-2])>mo?(g1[k-1]+g1[k-2]-mo):(g1[k-1]+g1[k-2])),
g2[k]=((g2[k-1]+g2[k-2])>mo?(g2[k-1]+g2[k-2]-mo):(g2[k-1]+g2[k-2]));
long long x=(Gi-g1[i])/g2[i];
printf("%lld\n",((g1[j]+x*g2[j]>mo)?(g1[j]+x*g2[j]-mo):(g1[j]+x*g2[j])));
}
return why();
}
把取模的代码用“%”换上之后得到了80分
#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;
int why()
{
fclose(stdin);
fclose(stdout);
return 0;
}
int main()
{
freopen("gibonacci.in","r",stdin);
freopen("gibonacci.out","w",stdout);
g1[0]=g2[1]=1;
g1[1]=g2[0]=0;
int t,k=2;
scanf("%d",&t);
for(;t;t--)
{
int i,Gi,j;
scanf("%d%d%d",&i,&Gi,&j);
if(j<0){printf("-1");continue;}
for(;k<=max(i,j)+10;k++)
g1[k]=(g1[k-1]+g1[k-2])%mo,g2[k]=(g2[k-1]+g2[k-2])%mo;
long long x=(Gi-g1[i])/g2[i];
printf("%lld\n",(g1[j]+x*g2[j])%mo);
}
return why();
}
在测试里找了找,发现“-1”么得了,这才想到好像真存在无解的情况······
最后改成这样才搞定(非常惊恐,可能要做俯卧撑)
#include<bits/stdc++.h>
using namespace std;
long long g1[100010],g2[100010],mo=19960515;
int why()
{
fclose(stdin);
fclose(stdout);
return 0;
}
int main()
{
freopen("gibonacci.in","r",stdin);
freopen("gibonacci.out","w",stdout);
g1[0]=g2[1]=1;
g1[1]=g2[0]=0;
int t,k=2;
scanf("%d",&t);
for(;t;t--)
{
int i,Gi,j;
scanf("%d%d%d",&i,&Gi,&j);
if(j<0){printf("-1\n");continue;}
for(;k<=max(i,j)+10;k++)
g1[k]=(g1[k-1]+g1[k-2])%mo,g2[k]=(g2[k-1]+g2[k-2])%mo;
if((Gi-g1[i])%g2[i]) {printf("-1\n");continue;}
long long x=(Gi-g1[i])/g2[i];
printf("%lld\n",(g1[j]+x*g2[j])%mo);
}
return why();
}