ural 1012. K-based Numbers. Version 2

来源:互联网 发布:圣剑神域全套完整源码 编辑:程序博客网 时间:2024/06/06 01:25

题意:问K进制的N位数中没有连续的0的数的个数。 2 ≤ K ≤ 10; N ≥ 2; N + K ≤ 180.


分析:和1009方法一样,但要用高精度计算加,乘。


Code:

#include <algorithm>#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <vector>#include <queue>#include <cmath>#include <map>#include <set>#define LL long long#define pb push_back#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;const int inf=0x3f3f3f3f;const int maxn=55;int f[200][2][222];int n,k;void add(int a[],int b[],int c[]){    for(int i=1;i<=210;i++){        c[i]+=a[i]+b[i];        c[i+1]+=c[i]/10;        c[i]%=10;    }}void mult(int a[],int x){    for(int i=1;i<=210;i++){        a[i]*=x;        a[i]+=(a[i-1]/10);        a[i-1]%=10;    }}int main(){    scanf("%d %d",&n,&k);    memset(f,0,sizeof(f));    f[1][0][1]=0;    f[1][1][1]=k-1;    for(int i=2;i<=n;i++){        for(int j=1;j<=210;j++) f[i][0][j]=f[i-1][1][j];        add(f[i-1][0],f[i-1][1],f[i][1]);        mult(f[i][1],k-1);    }    for(int i=1;i<=210;i++){        f[n+1][0][i]+=f[n][0][i]+f[n][1][i];        f[n+1][0][i+1]=f[n+1][0][i]/10;        f[n+1][0][i]%=10;    }    int id=210;    while(!f[n+1][0][id]) id--;    for(int i=id;i>=1;i--) printf("%d",f[n+1][0][i]);    printf("\n");    return 0;}


原创粉丝点击