zoukankan      html  css  js  c++  java
  • hdu4686 Arc of Dream

    解题思路:

    aibi=(ai-1*AX+AY)(bi-1*BX+BY)=AX*BX*ai-1bi-1+AX*BY*ai-1+BX*AY*bi-1+AY*BY

    n-1                    n-1                         n-1                   n-1   

    ∑ aibi  =  AX*BX*∑ ai-1bi-1 + AX*BY*∑ ai-1 + BX*AY*∑ bi-1 + (n-1)*AY*BY +A0*B0

    i=0                    i=0                          i=0                   i=0

    n-1          n-1

    ∑ ai = AX*∑ ai-1 + (n-1)*AY + A0

    i=0           i=0

    n-1          n-1

    ∑ bi = BX*∑ bi-1 + (n-1)*BY + B0

    i=0           i=0

    所以有:

    注意1和0的时候要特判。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #define mod 1000000007
     5 #define ll long long
     6 using namespace std;
     7 struct rec{
     8     ll v[5][5];
     9     rec(){memset(v,0,sizeof v);}
    10 };
    11 void debug(rec a){
    12     cout<<a.v[0][0]<<" "<<a.v[0][1]<<endl;
    13     cout<<a.v[0][2]<<" "<<a.v[0][3]<<endl;
    14 }
    15 rec mul(rec a,rec b){
    16     rec ans;
    17     ll sum;
    18     //debug(ans);
    19     //debug(a),debug(b);
    20     for(int i=0;i<5;i++){
    21        for(int j=0;j<5;j++){
    22            for(int k=0;k<5;k++){
    23                //cout<<a.v[i][k]<<" "<<b.v[k][j]<<endl;
    24                sum=a.v[i][k]%mod*b.v[k][j]%mod;
    25                ans.v[i][j]=(ans.v[i][j]+sum%mod)%mod;
    26            }
    27            //cout<<ans.v[i][j]<<endl;
    28        }
    29     }
    30     return ans;
    31 }
    32 
    33 rec pow(rec a,ll n){
    34     if(n==1) return a;
    35     rec ans=pow(a,n/2);
    36     ans=mul(ans,ans);
    37     if(n&1) return mul(ans,a);
    38     else return ans;
    39 }
    40 ll n,a1,b1;
    41 ll a0,ax,ay,b0,bx,by;
    42 ll f(rec a){
    43     ll x1=a.v[0][0],x2=a.v[0][1],x3=a.v[0][2],x4=a.v[0][3],x5=a.v[0][4];
    44     return ((((x1*a0%mod*b0%mod+x2*a0%mod)%mod+x3*b0%mod)%mod+x4)%mod+x5)%mod;
    45 }
    46 
    47 int main(){
    48     while(cin>>n){
    49         cin>>a0>>ax>>ay;
    50         cin>>b0>>bx>>by;
    51         if(n==0) {cout<<0<<endl;continue;}
    52         if(n==1) {cout<<a0*b0%mod<<endl;continue;}
    53         rec a;
    54         a.v[0][0]=ax%mod*bx%mod,a.v[0][1]=ax%mod*by%mod,a.v[0][2]=bx%mod*ay%mod,
    55         a.v[0][3]=ay%mod*by%mod,a.v[0][4]=a0%mod*b0%mod;
    56         a.v[1][0]=0,a.v[1][1]=ax%mod,a.v[1][2]=0,a.v[1][3]=ay%mod,a.v[1][4]=a0%mod;
    57         a.v[2][0]=0,a.v[2][1]=0,a.v[2][2]=bx%mod,a.v[2][3]=by%mod,a.v[2][4]=b0%mod;
    58         a.v[3][0]=0,a.v[3][1]=0,a.v[3][2]=0,a.v[3][3]=1,a.v[3][4]=1;
    59         a.v[4][0]=0,a.v[4][1]=0,a.v[4][2]=0,a.v[4][3]=0,a.v[4][4]=1;
    60         //debug(a);
    61         rec ans=pow(a,n-1);
    62         cout<<f(ans)%mod<<endl;
    63     }
    64     return 0;
    65 }
    hdu4686
  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/wonderzy/p/3407749.html
Copyright © 2011-2022 走看看