ahu-730-幸运抽奖
2016-04-09 15:55
281 查看
最多情况不超过long long,先DP打表再取模。
dp[52][1300][52] 一维代表此时选择的数的个数,二维代表此时的总和,三维代表此时选的最大数。
dp[i][j][k] = dp[i-1][j-1][1]+dp[i-1][j-2][2]+…dp[i-1][j-k1+1][k1];
有很多情况不用递推可以剪掉。
思路太繁琐,有没有人用二维DP或组合数学AC的啊!!!
dp[52][1300][52] 一维代表此时选择的数的个数,二维代表此时的总和,三维代表此时选的最大数。
dp[i][j][k] = dp[i-1][j-1][1]+dp[i-1][j-2][2]+…dp[i-1][j-k1+1][k1];
有很多情况不用递推可以剪掉。
思路太繁琐,有没有人用二维DP或组合数学AC的啊!!!
#include<cstdio> #include<cstring> #include<algorithm> long long dp[52][1300][52] = {0},n,m,la,mi,mod,am[2500],ans; int main() { dp[0][0][0] = 1; for(int i=1;i<=50;i++) for(int j=(i+1)*i/2;j<=(50+50-i+1)*i/2;j++) for(int k=i;k<=j&&k<=50;k++) { dp[i][j][k] = 0; for(int k1=0;k1<k;k1++) dp[i][j][k] += dp[i-1][j-k][k1]; } while(scanf("%I64d%I64d%I64d",&n,&m,&mod)!=EOF) { memset(am,0,sizeof(am)); la = (n+n-m+1)*m/2; mi = (1+m)*m/2; for(int i=mi;i<=la;i++) for(int j=1;j<=n;j++) { am[i]+=dp[m][i][j]; am[i]%=mod; } ans = 0; for(int i=mi;i<=la;i++) for(int j=mi;j<i;j++) ans = (ans+(am[i]%mod)*(am[j]%mod)%mod)%mod; printf("%I64d\n",ans); } }
相关文章推荐
- 车牌识别--S5PV210測试
- Highcharts混合图(2个Y轴)——结合后台数据
- 树型dp
- Android 第十一天重置版_新特性
- poj_1028
- bzoj1008: [HNOI2008]越狱
- 002-栈
- FZU 2032 Log函数问题 模拟小数加法
- Qt Quick实现的疯狂算数游戏
- Android-ndk-64位so文件问题(RSA加密采用cpp代码实现)
- Web开发_问题解决(3)之linux服务器上获取路径问题||jsp页面报错问题
- Cortex M3 NVIC与中断控制
- 6.2远程打印
- VmProtect v2.12.3 安装注册
- 防止表单重复提交
- 转载:css隐藏元素的几种方案
- RN(react native)入坑指南-02,一个登录示例
- android 打 release包解决字节对其问题
- 又遇No result defined for action org.action.AddAction and result success
- 二分匹配题集