列表

详情


NC229891. 斗地主

描述

牛牛一个人在打牌(他失去了牛妹),他有 m 种类型的牌,每种牌的分值是

0 回合时牛牛的分值为 0。每回合他都会打出一张牌,然后新的分值就是上一回合得分值加上这张牌的分值再对 k 取模 。

牛牛喜欢一个数字,当且仅当数字中含有 7 或者含有 9。请你告诉他 n 轮后他分值会是他所"喜欢"的方案数。

我们认为两种方案不同,当且仅当存在某一个回合牛牛打出的牌不同。

由于答案可能非常大,你只需要输出其对于 取模的结果。

输入描述

第一行包含三个数 n,m,k

第二行 m 个数,第 i 个数表示 a_i


输出描述

仅有一个数,牛牛打出”喜欢“数字的分值的方案数。

示例1

输入:

5 2 8
1 6

输出:

10

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 3ms, 内存消耗: 324K, 提交时间: 2021-12-18 15:29:19

#include<stdio.h>
#define P 1000000007
#define M 105
int n,m,k,a[M],dp[M][M];
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=m;++i)scanf("%d",&a[i]);
	dp[0][0]=1;
	for(int i=0;i<n;++i){
		for(int j=0;j<k;++j)
			for(int l=1;l<=m;++l){
				dp[i+1][(j+a[l])%k]=(dp[i+1][(j+a[l])%k]+dp[i][j])%P;
			}
	}
	int ans=0;
	for(int i=0;i<k;++i){
		int tp=i,f=0;
		while(tp){
			if(tp%10==9||tp%10==7)f=1;
			tp/=10;
		}
		if(f)ans=(ans+dp[n][i])%P;
	}printf("%d",ans);
}

pypy3 解法, 执行用时: 124ms, 内存消耗: 25884K, 提交时间: 2021-12-10 19:59:45

n, m, k = map(int, input().split())
dp = [0] * k
a = list(map(int, input().split()))
for i in a:
    dp[i] += 1
for i in range(n - 1):
    f = [0] * k
    for j in range(k):
        for _ in a:
            f[(j + _) % k] += dp[j]
    for j in range(k):
        f[j] %= int(1e9 + 7)
    dp = f
ans = 0
for i in range(k):
    if '7' in str(i) or '9' in str(i):
        ans += dp[i]
print(ans % int(1e9 + 7))

C++ 解法, 执行用时: 4ms, 内存消耗: 464K, 提交时间: 2021-12-10 19:06:01

#include<bits/stdc++.h>
using namespace std;
#define N 110
#define MOD 1000000007
int n,m,K,f[N][N],a[N],ans;
int main()
{
	f[0][0]=1;
	cin>>n>>m>>K;
	for(int i=1;i<=m;i++)cin>>a[i];
	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=0;k<K;k++)f[i][k]=(f[i][k]+f[i-1][(k-a[j]+K)%K])%MOD;
	for(int i=0;i<K;i++)if(i%10==7 || i%10==9)ans=(ans+f[n][i])%MOD;
	cout<<ans<<endl;
}

上一题