建议将此题降绿
  • 板块P2106 Sam数
  • 楼主STUDENT00
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/11/25 22:07
  • 上次更新2023/11/4 13:21:01
查看原帖
建议将此题降绿
658786
STUDENT00楼主2022/11/25 22:07

这题。。。一上来就是水倍增,AC了。。。

#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int n,a[15][15],b[15][15],ans;
void f(int n){
    if(n==1){
        for(int i=0;i<=9;i++) b[i][i]=1;
        return;
    }
    if(n&1LL){
        f(n>>1LL);
        swap(a,b);
        for(int i=0;i<=9;i++){
            for(int j=0;j<=9;j++){
            	b[i][j]=0;
                for(int k=0;k<=9;k++){
                    for(int h=max(k-2,0LL);h<=min(k+2,9LL);h++){
                        for(int p=max(j-2,0LL);p<=min(j+2,9LL);p++){
                        	b[i][j]=(b[i][j]+a[i][k]*a[h][p])%mod;
						}
                    }
                }
            }
        }
    }else{
        f(n>>1LL);
        swap(a,b);
        for(int i=0;i<=9;i++){
            for(int j=0;j<=9;j++){
            	b[i][j]=0;
                for(int k=0;k<=9;k++){
                    for(int h=max(k-2,0LL);h<=min(k+2,9LL);h++) b[i][j]=(b[i][j]+a[i][k]*a[h][j])%mod;
                }
            }
        }
    }
}
signed main(){
    scanf("%lld",&n);
    if(n==1){
    	printf("10");
    	return 0;
	}
    f(n);
    for(int i=1;i<=9;i++){
        for(int j=0;j<=9;j++) ans=(ans+b[i][j])%mod;
    }
    printf("%lld",ans);
    return 0;
}
2022/11/25 22:07
加载中...