您的位置:首页 > 其它

2013 ACM-ICPC长沙赛区全国邀请赛——A So Easy!

2013-07-18 11:27 489 查看
这题在比赛的时候不知道怎么做,后来看了别人的解题报告,才知道公式sn=(a+sqrt(b))^n+(a-sqrt(b))^n;

具体推导

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<string>
using namespace std;
struct ma
{
__int64 a[2][2];
void init()
{
a[0][0]=a[1][1]=1;
a[0][1]=a[1][0]=0;
}
};
int mod;
ma mul(ma a,ma b)
{
ma ans;
int i,j,k;
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
ans.a[i][j]=0;
for(k=0;k<2;k++)
ans.a[i][j]=(ans.a[i][j]%mod+((a.a[i][k]%mod)*(b.a[k][j]%mod)%mod))%mod;
}
return ans;
}
ma pows(ma a,__int64 n)
{
ma ans;
ans.init();
while(n)
{
if(n&1)
ans=mul(ans,a);
n>>=1;
a=mul(a,a);
}
return ans;
}
int main()
{
int a,b,n;
__int64 sum,q,s;
while(scanf("%d%d%d%d",&a,&b,&n,&mod)!=EOF)
{
ma p,ans;
s=2*a%mod;
p.a[0][0]=s;
p.a[0][1]=(b-a*a)%mod;
p.a[1][0]=1;
p.a[1][1]=0;
q=((2*a*a)%mod+2*b%mod)%mod;
ans=pows(p,n-1);
sum=(((ans.a[1][0]%mod)*(q%mod))%mod+((ans.a[1][1]%mod)*(s%mod)))%mod;
if(sum<0) sum=(sum+mod)%mod;
printf("%I64d\n",sum);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐