快速幂问题+中国剩余定理

poj 3233 矩阵快速幂+二分求解

题目传送门

//矩阵快速幂+二分
#include
#include
#include
using namespace std;
const int maxn=30+5;
typedef struct{
    int mar[maxn][maxn];
}MATRAX;
MATRAX a,per;                   //初始矩阵 单位矩阵
int n,m;
void init()
{
    memset(per.mar,0,sizeof(per.mar));
    for(int i=0;i>=1;
    }
    return ans;
}
MATRAX MatraxSum(int k)
{
    if(k==1) return a;
    MATRAX temp,b;
    temp=MatraxSum(k/2);
    if(k&1) {
        b=pow_mod(k/2);
        temp=add(temp,multi(temp,b));
        temp=add(temp,pow_mod(k));
    }
    else {
            b=pow_mod(k/2);
            temp=add(temp,multi(temp,b));
    }
    return temp;
}
int main()
{
    int k;
    while(scanf("%d%d%d",&n,&k,&m)==3)
    {
            init();
            MATRAX solve;
            solve=MatraxSum(k);
            for(int i=0;i

poj 1995 快速幂

题目传送门

//矩阵快速幂
#include
#include
using namespace std;
typedef long long LL;
LL pow_mod(LL a,LL b,LL MOD)
{
    LL res=1;
    while(b)
    {
        if(b&1) res=res*a%MOD;
        a=a*a%MOD;
        b>>=1;
    }
    return res;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        LL M,ans=0;
        scanf("%lld",&M);
        int k;
        scanf("%d",&k);
        for(int i=0;i

poj 1006 中国剩余定理      特殊的有规律的线性同余方程组

题目传送门

//中国剩余定理
#include
#include
using namespace std;
typedef long long LL;
void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
        return;
    }
    else {
        ex_gcd(b,a%b,d,x,y);
        LL temp=x;
        x=y;
        y=temp-(a/b)*y;
    }
}
int main()
{
    int kase=0;
    LL p,e,i,d;
    while(scanf("%lld%lld%lld%lld",&p,&e,&i,&d)==4)
    {
        if(p==-1&&e==-1&&i==-1&&d==-1) break;
        LL ans=0,f,x,y,M=23*28*33;
        ex_gcd(28*33,23,f,x,y);
        ans=(ans+28*33*x*p)%M;
        ex_gcd(23*33,28,f,x,y);
        ans=(ans+23*33*x*e)%M;
        ex_gcd(23*28,33,f,x,y);
        ans=(ans+23*28*x*i)%M;
        ans=ans-d;
        if(ans<=0) ans+=M;
        printf("Case %d: the next triple peak occurs in %lld days.\n",++kase,ans);
    }
    return 0;
}

hdu 1788 两种解法

题目传送门

1.找到了一定的规律,发现只需要求出这些数的最小公倍数,再减a即可

//中国剩余定理
#include
#include
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    LL n,a;
    while(scanf("%lld%lld",&n,&a)==2)
    {
        if(n==0&&a==0) break;
        LL M=1;
        for(int i=0;i

2.求解线性同余方程组

//求解线性同余方程组
#include
#include
using namespace std;
typedef long long LL;
void ex_gcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(b==0)
    {
        d=a;
        x=1;
        y=0;
        return;
    }
    else {
        ex_gcd(b,a%b,d,x,y);
        LL temp=x;
        x=y;
        y=temp-(a/b)*y;
    }
}
int main()
{
    LL n,a;
    while(scanf("%lld%lld",&n,&a)==2)
    {
        if(n==0&&a==0) break;
        LL r,k;
        scanf("%lld",&k);
        r=k-a;
        for(int i=0;i

 

你可能感兴趣的:(数论,快速幂)