博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj4002[JLOI2015]有意义的字符串
阅读量:7059 次
发布时间:2019-06-28

本文共 1428 字,大约阅读时间需要 4 分钟。

题意:

给出b,d,n。求

题解:

蒟蒻太弱只能引用

构造数列an=ban1+db2/4*an2 ,其中a0=2,a1=b,然后我们求出这个数列的通项公式,得到an=(b+d√2)n+(bd√2)n 即(b+d√2)n=an(bd√2)n 。由于b%2=1,d%4=1,因此db2/4一定是个正整数,故我们可以利用矩阵乘法来求出这个数列的第n项。由数据得bd√2∈(1,0],故后面那一项对答案有贡献当且仅当db2n为偶数。

 

 

代码:

1 #include 
2 #include
3 #include
4 #define ll unsigned long long 5 #define inc(i,j,k) for(int i=j;i<=k;i++) 6 #define mod 7528443412579576937 7 using namespace std; 8 9 struct M{10 ll a[5][5];11 M(){inc(i,0,1)inc(j,0,1)a[i][j]=0;}12 };13 ll b,d,n; M st,ans;14 ll cheng(ll a,ll b){15 if(b==0)return 0; if(b==1)return a; ll c=cheng(a,b>>1)%mod;16 if(b&1)return ((c+c)%mod+a)%mod;else return (c+c)%mod;17 }18 M mul(M a,M b){19 M c; inc(i,0,1)inc(j,0,1)inc(k,0,1)20 c.a[i][j]=(c.a[i][j]+cheng(a.a[i][k],b.a[k][j]))%mod;21 return c;22 }23 M pow(M a,ll b){24 if(b==1)return a; M c=pow(a,b>>1); if(b&1)return mul(mul(c,c),a);else return mul(c,c);25 }26 int main(){27 scanf("%lld%lld%lld",&b,&d,&n);28 if(n==0){printf("1"); return 0;}29 st.a[0][0]=b%mod; st.a[0][1]=2;30 if(n==1)ans=st;else{31 ans.a[0][0]=b%mod; ans.a[0][1]=1; ans.a[1][0]=(d-b*b)/4%mod;32 ans=pow(ans,n-1); ans=mul(st,ans);33 }34 if(b*b!=d&&!(n&1))printf("%lld",(ans.a[0][0]+mod-1)%mod);else printf("%lld",ans.a[0][0]);35 return 0;36 }

 

20160710

转载于:https://www.cnblogs.com/YuanZiming/p/5876613.html

你可能感兴趣的文章
iOS多用连接、反向协议、安全
查看>>
Swift - 滚动视图(UIScrollView)的用法
查看>>
Altium Designer 出现错误提示(警告)adding items to hidden net GND/VCC
查看>>
poj 3270(置换 循环)
查看>>
RHCE7 管理I-12归档文件并在Linux系统间复制文件
查看>>
第十四回(一):外战折戟再图雪耻 石路徜徉终是难忘
查看>>
Android中Menu的基本用法
查看>>
接口JSon字符串格式
查看>>
[转]java基础学习总结——equals方法
查看>>
SVN相关
查看>>
MapReduce在实际编程“I/O”
查看>>
SecureCRT配色
查看>>
Spring、Spring MVC、MyBatis整合文件配置详解
查看>>
spring-mvc 与 openid4java
查看>>
iBatis简单入门教程
查看>>
将archlinux 2013-06-01版,安装配置为个人工作站
查看>>
十大流行Linux发行版
查看>>
微信公众平台消息接口开发之微信浏览器HTTP_USER_AGENT判断
查看>>
Android自定义ScrollView实现一键置顶功能
查看>>
samba配置
查看>>