HDOJ-5446 Clarke and problem(DP)
2015-09-22 10:12
435 查看
设d(i,j)d(i, j)d(i,j)表示前iii个数,模ppp为jjj的方案数,则容易得到d(0,0)=1,d(i,j)=d(i−1,j)+∑j=0p−1d(i−1,(j−a[i]) mod p)d(0,
0)=1, d(i, j)=d(i-1, j)+\sum_{j=0}^{p-1} d(i-1, (j-a[i]) \ mod \ p)d(0,0)=1,d(i,j)=d(i−1,j)+∑j=0p−1d(i−1,(j−a[i]) mod p),很多人没1a是因为没注意∣ai∣≤109|a_i|
\le 10^9∣ai∣≤109
0)=1, d(i, j)=d(i-1, j)+\sum_{j=0}^{p-1} d(i-1, (j-a[i]) \ mod \ p)d(0,0)=1,d(i,j)=d(i−1,j)+∑j=0p−1d(i−1,(j−a[i]) mod p),很多人没1a是因为没注意∣ai∣≤109|a_i|
\le 10^9∣ai∣≤109
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; const int N=1005; int base=1e9+7; int f ; int a ; void add(int &a, int b) { if((a+=b)>=base) a-=base; } void work() { int i,j,n,p; scanf("%d%d",&n,&p); for(i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]%=p; } memset(f,0,sizeof(f)); f[0][0]=1; for(i=1;i<=n;i++) for(j=0;j<p;j++) { add(f[i][j],f[(i-1)][j]); add(f[i][j],f[(i-1)][(j-a[i]+p)%p]); } printf("%d\n",f [0]); } int main() { int T; scanf("%d",&T); while(T--) work(); return 0; }
相关文章推荐
- 一键清除Centos iptables 所有规则
- python3入门之类
- iOS模拟器多个虚拟机怎么处理
- #pragma once
- c指针加减值得问题
- 什么是seo
- 《Xilinx可编程逻辑器件设计与开发(基础篇)》连载13:Spartan-6的BRAM(Block RAM)模块
- document.documentElement与document.body
- ioctl函数
- 完美主义:实现iOS输入框自动移动
- Android 5.x新特性之利用Palette获取图片的主题色
- C语言数据定义长度 16位、32位、64位
- POI操作excel
- Jplayer用法
- centos-7 最小安装 上网设置
- mount --bind 的妙用
- java 学习银行调度学习笔记
- 计算机网络面试常考
- c#MVC文件(图片,word,excel,zip等)批量上传
- 9-13 文本处理工具sed及awk的用法