Loading [MathJax]/jax/output/CommonHTML/jax.js

【BZOJ】【4002】【JLOI2015】有意义的字符串

构造线性递推式+矩阵乘法


  题解戳PoPoQQQ

  

为了自己以后看的方便手打一遍好了>_>

  求(b+d2)n的整数部分对p取模后的值

  其中bmod2=1,dmod4=1,b2d<(b+1)2,n1018

 

思路:

构造数列an=ban1+db24an2

其中a0=2,a1=b

然后我们求出这个数列的通项公式,得到an=(b+d2)n+(bd2)n

因此得到(b+d2)n=an(bd2)n

由于bmod2=1,dmod4=1,因此db24一定是个正整数,故我们可以利用矩阵乘法来求出这个数列的第n

然后对于80%的数据b2d<(b+1)2,对于20%的数据b=1,d=5,因此(bd2)n(1,0]

故后面那一项对答案有贡献当且仅当 db2n为偶数

时间复杂度O(log2n)

 

P.S.话说题目给的提示:题目名有意义的字符串“jxamfe”以及那个奇怪的模数我还是没明白提示在哪了……>_>我讨厌猜字谜QAQ

复制代码
 1 /**************************************************************
 2     Problem: 4002
 3     User: Tunix
 4     Language: C++
 5     Result: Accepted
 6     Time:48 ms
 7     Memory:1272 kb
 8 ****************************************************************/
 9  
10 //Huce #5 A
11 #include<cmath>
12 #include<vector>
13 #include<cstdio>
14 #include<cstdlib>
15 #include<cstring>
16 #include<iostream>
17 #include<algorithm>
18 #define rep(i,n) for(int i=0;i<n;++i)
19 #define F(i,j,n) for(int i=j;i<=n;++i)
20 #define D(i,j,n) for(int i=j;i>=n;--i)
21 using namespace std;
22 typedef unsigned long long LL;
23 LL getll(){
24     LL v=0,sign=1; char ch=getchar();
25     while(ch<'0'||ch>'9') {if (ch=='-') sign=-1; ch=getchar();}
26     while(ch>='0'&&ch<='9') {v=v*10+ch-'0'; ch=getchar();}
27     return v*sign;
28 }
29 const int N=100010,INF=~0u>>2;
30 const LL MOD=7528443412579576937LL;
31 /*******************tamplate********************/
32 LL b,d,n;
33 struct matrix{
34     LL d[3][3];
35     LL* operator [] (int x){ return d[x];}
36     matrix(int x=0){
37         F(i,0,2) F(j,0,2)
38             if (i==j && i) d[i][j]=x;
39             else d[i][j]=0;
40     }
41 }a;
42 inline LL mul(LL a,LL b){
43     LL r=0;
44     for(;b;b>>=1,a=(a+a)%MOD)
45         if (b&1) r=(r+a)%MOD;
46     return r;
47 }
48 inline matrix operator * (matrix a,matrix b){
49     matrix c;
50     F(i,1,2) F(j,1,2) F(k,1,2) (c[i][j]+=mul(a[i][k],b[k][j]))%=MOD;
51     return c;
52 }
53 inline matrix Pow(matrix a,LL b){
54     matrix r(1);
55     for(;b;b>>=1,a=a*a) if (b&1) r=r*a;
56     return r;
57 }
58 int main(){
59     b=getll(); d=getll(); n=getll();
60     a[1][1]=0; a[1][2]=(d-b*b)/4;
61     a[2][1]=1; a[2][2]=b;
62     a=Pow(a,n);
63     cout<<((a[1][1]*2%MOD+mul(b,a[2][1])-(d!=b*b&&!(n&1)))%MOD+MOD)%MOD<<endl;
64     return 0;
65 }
View Code
复制代码

4002: [JLOI2015]有意义的字符串

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 54  Solved: 28
[Submit][Status][Discuss]

Description

 B 君有两个好朋友,他们叫宁宁和冉冉。

有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求((b+sqrt(D)/2)^N的整数部分,请输出结果 Mod 7528443412579576937 之后的结果吧。

Input

一行三个整数 b;d;n

 

Output

 一行一个数表示模 7528443412579576937 之后的结果。

Sample Input

1 5 9

Sample Output

76

HINT

 0 <b^2 < d< (b +1)2 < 10^18。

Source

[Submit][Status][Discuss]
posted @   Tunix  阅读(1688)  评论(4)    收藏  举报
编辑推荐:
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
阅读排行:
· 使用TypeScript开发微信小程序(云开发)-入门篇
· 没几个人需要了解的JDK知识,我却花了3天时间研究
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 管理100个小程序-很难吗
· 在SqlSugar的开发框架中增加对低代码EAV模型(实体-属性-值)的WebAPI实现支持
点击右上角即可分享
微信分享提示