zoukankan      html  css  js  c++  java
  • hdu4686 Arc of Dream 矩阵快速幂

    An Arc of Dream is a curve defined by following function:


    where
    a0 = A0
    ai = ai-1*AX+AY
    b0 = B0
    bi = bi-1*BX+BY
    What is the value of AoD(N) modulo 1,000,000,007?

    矩阵快速幂

     1 #include<stdio.h>
     2 #include<string.h>
     3 typedef long long ll;
     4 const int mod=1000000007;
     5 
     6 struct mat{
     7     int r,c;
     8     ll m[6][6];
     9     void clear(){
    10         for(int i=1;i<=r;i++)memset(m[i],0,sizeof(m[i]));
    11     }
    12 };
    13 
    14 mat MatMul(mat &m1,mat &m2){
    15     mat tmp;
    16     tmp.r=m1.r;
    17     tmp.c=m2.c;
    18     int i,j,k;
    19     for(i=1;i<=tmp.r;i++){
    20         for(j=1;j<=tmp.c;j++){
    21             ll t=0;
    22             for(k=1;k<=m1.c;k++){
    23                 t=(t+(m1.m[i][k]*m2.m[k][j])%mod)%mod;
    24             }
    25             tmp.m[i][j]=t;
    26         }
    27     }
    28     return tmp;
    29 }
    30 
    31 mat MatQP(mat &a,ll n){
    32     mat ans,tmp=a;
    33     ans.r=ans.c=a.r;
    34     memset(ans.m,0,sizeof(ans.m));
    35     for(int i=1;i<=ans.r;i++){
    36         ans.m[i][i]=1;
    37     }
    38     while(n){
    39         if(n&1)ans=MatMul(ans,tmp);
    40         n>>=1;
    41         tmp=MatMul(tmp,tmp);
    42     }
    43     return ans;
    44 }
    45 
    46 int main(){
    47     ll n;
    48     mat a;
    49     a.r=5,a.c=1;
    50     mat tmp;
    51     tmp.c=tmp.r=5;
    52     ll a0,b0,ax,ay,bx,by;
    53     while(scanf("%lld",&n)!=EOF){
    54         scanf("%lld%lld%lld%lld%lld%lld",&a0,&ax,&ay,&b0,&bx,&by);
    55         a0%=mod;
    56         ax%=mod;
    57         ay%=mod;
    58         b0%=mod;
    59         bx%=mod;
    60         by%=mod;
    61         a.clear();
    62         a.m[1][1]=0;
    63         a.m[2][1]=(a0*b0)%mod;
    64         a.m[3][1]=b0;
    65         a.m[4][1]=a0;
    66         a.m[5][1]=1;
    67         tmp.clear();
    68         tmp.m[1][1]=tmp.m[1][2]=tmp.m[5][5]=1;
    69         tmp.m[2][2]=(ax*bx)%mod;
    70         tmp.m[2][3]=(ay*bx)%mod;
    71         tmp.m[2][4]=(ax*by)%mod;
    72         tmp.m[2][5]=(ay*by)%mod;
    73         tmp.m[3][3]=bx;
    74         tmp.m[3][5]=by;
    75         tmp.m[4][4]=ax;
    76         tmp.m[4][5]=ay;
    77 //        tmp.m[1][3]=tmp.m[1][4]=tmp.m[1][5]=tmp.m[2][1]=tmp.m[3][1]=tmp.m[3][2]=tmp.m[3][4]=tmp.m[4][1]=tmp.m[4][2]=tmp.m[4][3]=tmp.m[5][1]=tmp.m[5][2]=tmp.m[5][3]=tmp.m[5][4]=0;
    78         tmp=MatQP(tmp,n);
    79         a=MatMul(tmp,a);
    80         printf("%lld
    ",a.m[1][1]);
    81     }
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    python中json.dumps()和json.dump() 以及 json.loads()和json.load()的区分
    Python的函数
    Python的Set容器
    Python的Dict容器
    Python的tuple容器
    Python的List容器
    python 的控制流程
    Python 数据类型
    k8s-Pod调度策略
    K8s创建pod yaml文件详解
  • 原文地址:https://www.cnblogs.com/cenariusxz/p/6598504.html
Copyright © 2011-2022 走看看