• EvenF


    EvenF

    时间限制: 1 Sec  内存限制: 128 MB

    题目描述

    一个阶为的扇是一个以0,1...,n为顶点且有2n-1条边所定义的图:其中0和1,2...n相连,k和k-1相连(k∈[n]).(阶为4的扇如图所示)
    现在请你回答阶为n的扇的生成树个数(答案mod 1000000009 输出)

    输入

    仅有一行,输入1个用空格隔开的正整数n(n≤101000000).

    输出

    仅有一行,输出一个非负整数:生成树个数对1000000009取模后的值

    样例输入 Copy

    100
    

    样例输出 Copy

    357806304

    题解:矩阵快速幂板子题,关键在n的处理上,详见代码!(注意mod是1e9+9)
    AC代码:
     1 #pragma GCC optimize(3)
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 typedef long long ll;
     5 const ll mod=1e9+9;
     6 const int maxn=1e6+50;
     7 struct Mat
     8 {
     9     int n,m;
    10     ll mat[2][2];
    11     Mat(){
    12         memset(mat,0,sizeof(mat));
    13         n=2,m=2;
    14     }
    15     Mat(int x,int y){
    16         memset(mat,0,sizeof(mat));
    17         n=x,m=y;
    18     }
    19     Mat operator*(Mat b){
    20         Mat c(n,b.m);
    21         for(int i=0;i<n;i++)
    22             for(int j=0;j<b.m;j++)
    23                 for(int k=0;k<m;k++){
    24                     c.mat[i][j]=(c.mat[i][j]+mat[i][k]*b.mat[k][j]%mod)%mod;
    25                 }
    26         return c;
    27     }
    28 }E,A;
    29 Mat qpow(Mat a,ll b)
    30 {
    31     Mat res=E;
    32     while(b){
    33         if(b&1) res=res*a;
    34         a=a*a;
    35         b>>=1;
    36     }
    37     return res;
    38 }
    39 char str[maxn];
    40 int n;
    41 int main()
    42 {
    43     A.n=A.m=2;
    44     A.mat[0][0]=2;A.mat[0][1]=1;
    45     A.mat[1][0]=1;A.mat[1][1]=1;
    46     scanf("%s",str+1);
    47     n=strlen(str+1);
    48     if(n==1 && str[1]=='0'){
    49         printf("1
    ");
    50         return 0;
    51     }
    52     for(int i=n;i>=1;i--){
    53         if(str[i]>='1'){
    54             str[i]--;
    55             break;
    56         }
    57         else str[i]='9';
    58     }
    59     E.n=E.m=2;
    60     E.mat[0][0]=1;E.mat[0][1]=0;
    61     E.mat[1][0]=0;E.mat[1][1]=1;
    62     Mat ans=E;
    63     for(int i=1;i<=n;i++){
    64         int tag=str[i]-'0';
    65         ans=qpow(ans,10)*qpow(A,tag);
    66     }
    67     printf("%lld
    ",(ans.mat[0][0]+ans.mat[0][1])%mod);
    68     return 0;
    69 }
    View Code
     
  • 相关阅读:
    case when的使用
    docker 修改容器时间 和时区 的方法 (linux也能用)
    canal笔记
    jenkins集成git,输入分支构建的方法(还没试,用到再看看)
    unittest官网和别人的翻译(有空看看)
    靶机
    CSharp: Reflection in donet 6
    Python: Memento Pattern
    Python: Visitor Pattern
    Python: Command Pattern
  • 原文地址:https://www.cnblogs.com/lglh/p/12285659.html
Copyright © 2020-2023  润新知