HDU-4565 So Easy! 矩阵快速幂 & 共轭构造

原题链接:
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.最近好多坑没填,这个矩阵快速幂是第一次打…好像也就这么回事

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值