【NOIP模拟】计数

来源:互联网 发布:苹果还是外星人 程序员 编辑:程序博客网 时间:2024/04/29 23:15

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");}
1 0
原创粉丝点击