您的位置:首页 > 其它

【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");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: