原题链接:
HDU-4565
Limits:
0< a, m < 2^15, (a-1^)2< b < a^2, 0 < b, n < 2^31
大意:RT
思路:
有向上取整在,完全没办法算出来的,只能通过推导解掉。
思考为什么不是向下取整而是向上取整。
题目式子联想到其共轭形式
代码实现:
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
#define mem(s,t) memset(s,t,sizeof(s))
#define D(v) cout<<#v<<" "<<v<<endl
#define inf 0x3f3f3f3f
#define pb push_back
//#define LOCAL
inline void read(ll &x){
x=0;char p=getchar();
while(!(p<='9'&&p>='0'))p=getchar();
while(p<='9'&&p>='0')x*=10,x+=p-48,p=getchar();
}
ll a,b,n,mod;
struct Matrix{
ll a[2][2];
};
Matrix mul(Matrix x,Matrix y){
Matrix ret;
mem(ret.a,0);
for(ll i=0;i<2;i++){
for(ll j=0;j<2;j++){
for(ll k=0;k<2;k++){
ret.a[i][j]=(ret.a[i][j]+x.a[i][k]*y.a[k][j]%mod+mod)%mod;
}
}
}
return ret;
}
Matrix fastm(Matrix a,ll n){
if(n==1) return a;
Matrix ret;
for(ll i=0;i<2;i++)for(ll j=0;j<2;j++) ret.a[i][j]=(i==j?1:0);
while(n){
if(n&1) ret=mul(ret,a);
n>>=1;
a=mul(a,a);
}
return ret;
}
int main() {
while(~scanf("%lld%lld%lld%lld",&a,&b,&n,&mod)){
Matrix N,M;
N.a[0][0]=2*a;N.a[1][1]=0;
N.a[0][1]=b-a*a;N.a[1][0]=1;
M=fastm(N,n-1);
ll ans=(1LL*M.a[0][0]*2*a%mod+1LL*M.a[0][1]*2%mod)%mod;
printf("%lld\n",ans);
}
return 0;
}
PS.最近好多坑没填,这个矩阵快速幂是第一次打…好像也就这么回事