Xn数列(codevs 1281)

题目描述 Description

给你6个数,m, a, c, x0, n, g

Xn+1 = ( aXn + c ) mod m,求Xn

m, a, c, x0, n, g<=10^18

输入描述 Input Description

一行六个数 m, a, c, x0, n, g

输出描述 Output Description

输出一个数 Xn mod g

样例输入 Sample Input

11 8 7 1 5 3

样例输出 Sample Output

2

/*
  这个题显然用矩阵乘法,公式也很好推。
*/
#include<cstdio>
#include<iostream>
#define lon long long
using namespace std;
lon m,a,c,x,n,g;
struct node{
    lon v[2][2];
};
lon Mul(lon s1,lon s2){//快速乘
    lon r=0,base=s1;
    while(s2){
        if(s2&1)r+=base;
        base+=base;
        r%=m;
        base%=m;
        s2>>=1;
    }
    return r;
}
node cheng(node s1,node s2){
    node s3;s3.v[0][0]=s3.v[0][1]=s3.v[1][0]=s3.v[1][1]=0;
    for(int i=0;i<=1;i++)
        for(int j=0;j<=1;j++)
            for(int k=0;k<=1;k++){
                s3.v[i][j]+=Mul(s1.v[i][k],s2.v[k][j]);//s1.v[i][k]*s2.v[k][j];
                s3.v[i][j]%=m;
            }
    return s3;
}
node poww(node aa,lon bb){
    node base=aa,r;
    r.v[0][0]=r.v[1][1]=1;
    r.v[0][1]=r.v[1][0]=0;
    while(bb){
        if(bb&1)r=cheng(r,base);
        base=cheng(base,base);
        bb>>=1;
    }
    return r;
}
int main(){
    cin>>m>>a>>c>>x>>n>>g;
    node s1,s2;
    s1.v[0][0]=x;s1.v[0][1]=1;
    s1.v[1][0]=0;s1.v[1][1]=0;
    s2.v[0][0]=a;s2.v[0][1]=0;
    s2.v[1][0]=c;s2.v[1][1]=1;
    node ans=poww(s2,n);
    ans=cheng(s1,ans);
    cout<<ans.v[0][0]%g;
    return 0;
}
时间: 2024-10-07 04:37:28

Xn数列(codevs 1281)的相关文章

[CODEVS 1281] Xn数列

描述 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn http://codevs.cn/problem/1281/ 分析 比较裸的矩阵乘法题, 好久没做了, 写写思路 假设矩阵 A = { {a1, a2}, {a3, a4} }, B = { {b1, b2}, {b3, b4} }. 根据矩阵乘法的计算方法, 有 : A×B = { {a1b1+a2b2, a1b2+a2b4}, {a3b1+a4b3, a3b2+a4b4} }. 那

【WikiOI "天梯"1281】 Xn数列

题目描述Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述Input Description 一行六个数 m, a, c, x0, n, g 输出描述Output Description 输出一个数 Xn mod g 样例输入Sample Input 11 8 7 1 5 3 样例输出Sample Output 2 数据范围及提示Data Size & H

C++之路进阶——矩阵乘法(Xn数列)

1281 Xn数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述 Input Description 一行六个数 m, a, c, x0, n, g 输出描述 Output Description 输出一个数 Xn mod g 样例输入 Sample Inpu

【CODEVS】1281 Xn数列

[算法]矩阵快速幂 [题解]T*A(n-1)=A(n)矩阵如下: a 1 * x(n-1) 0 = xn 0 0 1    c        0    c   0 防止溢出可以用类似快速幂的快速乘. #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll MOD,A,c,x0,n,g,a[2][2],b[2][2],t[2][2]; ll mull(ll x,ll y) {

codevs 1281 Xn数列 (矩阵乘法)

/* 再来个题练练手 scanf longlong 有bug....... */ #include<cstdio> #include<iostream> #include<cstring> #define ll long long using namespace std; ll n,m,x,y,x0,g; ll f[3][3],a[3][3]; ll slow_mul(ll a,ll b,ll c) { ll ans=0; a=a%c;b=b%c; while(b) {

【CODEVS1281】Xn数列

Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 Input 一行六个数 m, a, c, x0, n, g Output 输出一个数 Xn mod g Sample Input 11 8 7 1 5 3 Sample Output 2 HINT int64按位相乘可以不要用高精度. 题解 对于取模运算进行一个修改,将乘法修改为倍增乘法(类似于快速幂): long l

codevs1281 Xn数列

题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入描述 Input Description 一行六个数 m, a, c, x0, n, g 输出描述 Output Description 输出一个数 Xn mod g 样例输入 Sample Input 11 8 7 1 5 3 样例输出 Sample Output 2 数据范围及提示 Data Size

总结-数学

数学 比较害怕数学题, 因为数学题一般代码比较短, 一旦想到正解往往就能AC, 但是我数学水平很洼, 知道的东西也比较少. 感觉写写暴力拿部分分比较现实. 毕竟不是每个人都能找到正解. 1. 组合数 一般用阶乘计算, 需要求逆元. 可以用lucas定理优化时间复杂度. 组合类的问题就要考虑组合数 1. BestCoder-Round#33 第二题是组合数的题目 2. BZOJ-1005-明明的烦恼 用组合数阶乘公式推导出最后的式子 3. BZOJ-1951-古代猪文-SDOI2010-费马小定理

矩阵快速幂的一份小结

矩阵真是个好东西!虽然矩乘的复杂度有点难看... ... 这几天也做了不少矩阵题目,还是有几道好题目的.不过我打算从入门开始. 矩阵乘法:A[i][k]*B[k][j]=C[i][j];(A的第i行的每项依次乘以B的第j列的每项的和) 很显然这是一个n^3的算法,还是比较难看的. 代码就差不多是这样了. struct Matrix{int T[51][51];}; Matrix Mul(Matrix a,Matrix b,int I,int K,int J) { Matrix S=S0; for