【NOIP模拟】计数

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
#include
#include
#include
#include
#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");
}

你可能感兴趣的:(noip,数位DP,高精度)