RE 10pts,求助
  • 板块P2106 Sam数
  • 楼主zjinze
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/12/10 20:36
  • 上次更新2023/12/10 21:00:10
查看原帖
RE 10pts,求助
868864
zjinze楼主2023/12/10 20:36

思路就是数位 dp,除一个特判外,全 RE 。

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1000000007;
int dp[25][11],k,digit[25];
int work1(int x){
	int cnt=0,ans=0;
	for(cnt=1;cnt<=x;cnt++){
		digit[cnt]=0;
	}
	digit[++cnt]=1;
	for(int i=1;i<cnt;i++){
		for(int j=1;j<10;j++){
			ans+=dp[i][j];
			ans%=mod;
		}
	}
	for(int i=1;i<digit[cnt];i++){
		ans=ans+dp[cnt][i];
		ans%=mod;
	}
	for(int i=cnt-1;i>=1;i--){
		for(int j=0;j<digit[i];j++){
			if(abs(digit[i+1]-j)<=2){
				ans+=dp[i][j];
				ans%=mod;
			}
		}
		if(abs(digit[i]-digit[i+1])>2)break;
	}
	return ans;
}
int work2(int x){
	int cnt=0,ans=0;
	for(cnt=1;cnt<x;cnt++){
		digit[cnt]=0;
	}
	digit[++cnt]=1;
	for(int i=1;i<cnt;i++){
		for(int j=1;j<10;j++){
			ans+=dp[i][j];
			ans%=mod;
		}
	}
	for(int i=1;i<digit[cnt];i++){
		ans=ans+dp[cnt][i];
		ans%=mod;
	}
	for(int i=cnt-1;i>=1;i--){
		for(int j=0;j<digit[i];j++){
			if(abs(j-digit[i+1])<=2){
				ans+=dp[i][j];
				ans%=mod;
			}
		}
		if(abs(digit[i]-digit[i+1])>2)break;
	}
	return ans;
}
signed main(){ 
	for(int i=0;i<10;i++){
		dp[1][i]=1;
	}
	for(int i=2;i<=20;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++){
				if(abs(j-k)<=2){
					dp[i][j]+=dp[i-1][k];
					dp[i][j]%=mod;
				}
			}
		}
	}
	cin>>k;
	if(k==1){
		cout<<10;
		exit(0);
	}
	k--;
	cout<<(work1(k)-work2(k)+mod)%mod;
	return 0;
}
2023/12/10 20:36
加载中...