斗地主(牛客)


很明显的一个dp
dp[i][j]表示打了前i张牌模数为j的方案数
转移方程:
dp[i][(j+a[x])%k]=dp[i][(j+a[x])%k]+dp[i-1][j];
初始状态dp[0][0]=1;

#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
const int mod=1e9+7;
int a[55];
ll dp[105][55];
int main(){
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)cin>>a[i];
	dp[0][0]=1;
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=m;j++)
		  for(int z=0;z<k;z++)
			dp[i][(z+a[j])%k]=(dp[i][(z+a[j])%k]+dp[i-1][z])%mod;
	ll ans=0;
	for(int i=0;i<k;i++)
	if(i==7||i==17||i==27||i==37||i==47||i==9||i==19||i==29||i==39||i==49)
	ans=(ans+dp[n][i])%mod;
	cout<<ans<<endl;
     return 0;
}
原文地址:https://www.cnblogs.com/wzxbeliever/p/15693075.html