【NOIP模拟】计数
2016-07-15 19:29
281 查看
Description
Solution
还以为是数位DP呢,实际上还是数位DP,最简单的数位DP。设f[i,0]和f[i,1]表示到当前第i位,取0和不取0的方案数,转移很显然f[i,0]=f[i-1,1],f[i,1]=(f[i-1,0]+f[i-1,1])*(k-1)。
但是直接做会爆,要打高精度。
十分的水……
Code
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define fo(i,a,b) for(i=a;i<=b;i++) #define fod(i,a,b) for(i=a;i>=b;i--) using namespace std; const int maxn=18007; int i,j,k,l,t,n,m,ans,a,b,aa,bb; struct node{ int a[maxn]; }c,d,e,f,g,h; node jia(node a,node b){ memset(e.a,0,sizeof(e.a)); int i,j,k=0;e.a[0]=max(a.a[0],b.a[0]); fo(i,1,e.a[0]){ e.a[i]=e.a[i]+k+a.a[i]+b.a[i]; k=e.a[i]/10; e.a[i]%=10; } if(k!=0)e.a[++e.a[0]]=k; return e; } void fu(node &a,node b){ int i; a.a[0]=b.a[0]; fo(i,1,a.a[0])a.a[i]=b.a[i]; } int main(){ scanf("%d%d",&n,&k); a=0,b=k-1; while(b!=0){ d.a[++d.a[0]]=b%10; b/=10; } fo(i,2,n){ h=jia(c,d); fu(c,d); fu(g,h); memset(h.a,0,sizeof(h.a)); fo(j,1,k-1) h=jia(h,g); fu(d,h); } h=jia(c,d); fod(i,h.a[0],1)printf("%d",h.a[i]); printf("\n"); }
相关文章推荐
- 解决QMediaPlayer没有声音的问题
- 1069. The Black Hole of Numbers (20)
- 用递归和非递归的形式实现二叉树的前中后序遍历
- KEIL MAP文件分析
- [个人博客搬运]Method Swizzling的简单应用场景
- JZOJ 4603 颜料大乱斗【NOIP2016提高A组模拟7.15】
- 程序开发圣经
- vijos1782——借教室(noip2012)
- 开发板的烧录
- 视频 -> 帧 浅析
- mongodb 分片集群中加入新的config servers
- Android AlarmManager的一些问题
- 黑苹果实战安装经历
- 基本数据类型总结
- hdu5655-BestCoder Round #78 (div.2)
- 线程与进程的区别
- c#——Winform PropertyGrid使用
- 依赖倒置原则详解--七大面向对象设计原则(3)
- 安卓手机测试常见BUG
- [Leetcode]303. Range Sum Query - Immutable