bzoj4002 [JLOI2015]有意义的字符串 快速幂
2024-10-20 13:48:53
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。
题解
http://blog.csdn.net/popoqqq/article/details/45148309
沈老师的特征方程,(⊙o⊙)…,然后oj上floor it,是其部分分部分,矩阵乘法即可。
#include<set>
#include<map>
#include<ctime>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm> #define ll unsigned long long
#define mod 7528443412579576937UL
using namespace std;
ll read()
{
ll x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
ll b,d,n,A,B;
ll mul(ll a,ll b)
{
ll ans=;a%=mod;
for(ll i=b;i;i>>=,a=(a+a)%mod)
if(i&)ans=(ans+a)%mod;
return ans;
}
struct M{
ll a[][];
M(){
memset(a,,sizeof(a));
}
friend M operator*(M a,M b){
M ans;
for(int i=;i<;i++)
for(int j=;j<;j++)
for(int k=;k<;k++)
(ans.a[i][j]+=mul(a.a[i][k],b.a[k][j]))%=mod;
return ans;
}
friend M operator^(M a,ll b){
M ans;
ans.a[][]=ans.a[][]=;
for(ll i=b;i;i>>=,a=a*a)
if(i&)ans=ans*a;
return ans;
}
}a,ans;
int main()
{
b=read();d=read();n=read();
A=b;B=(d-b*b)/;
a.a[][]=;a.a[][]=B;a.a[][]=A;
ans.a[][]=;ans.a[][]=b;
int F=;
if(b*b!=d&&n%==)F=;
printf("%lld\n",(((a^n)*ans).a[][]-F+mod)%mod);
}
最新文章
- SE1-soc入手又有的东西可以玩了
- python多线程之semaphore(信号量)
- JS中的特有语句-for in
- C#- 反射之 GetType()方法
- hbase基本操作
- Spring MVC 详解(二)
- PreferenceActivity使用方法
- ubuntu on win VS ubuntu(virtual box)VS Cygwin
- cognos10.2.2使用ODBC连接oracle92数据库(BMT-IMP-0016)
- Android studio dabao
- CentOS通过yum安装php7.0
- Orchard 学习
- python常用模块(1):collections模块和re模块(正则表达式详解)
- MeshCollider双面化脚本
- Get/POST方法提交的长度限制
- BZOJ_3872_[Poi2014]Ant colony_dfs
- Java注解(一):介绍,作用,思想及优点
- LOJ#3043.【ZJOI2019】 线段树 线段树,概率期望
- Windows10 磁盘100%解决办法
- vs2017无法安装