标签:style blog class code java color
水了ural的dp专题前三道1009,1012,1013,都是同一个问题,只是数据规模变大了。
题意大概是这样的:求一个k进制的n位数字,满足不含前导0和不含连续两个0的个数有多少个。
dp[i][0]表示第i位为0有多少个满足条件,dp[i][1]表示i位不为0满足条件的个数,则结果就是dp[n][1];
递推关系如下:
dp[i][0]=dp[i-1][1];
dp[i][1]=(dp[i-1][0]+dp[i-1][1])*k;
顺便贴上简单的大数类
1 #include<iostream> 2 #include<iomanip> 3 #include<cstring> 4 #include<stdio.h> 5 #include<map> 6 #include<cmath> 7 #include<algorithm> 8 #include<vector> 9 #include<stack> 10 #include<fstream> 11 #include<queue> 12 #define rep(i,n) for(int i=0;i<n;i++) 13 #define fab(i,a,b) for(int i=(a);i<=(b);i++) 14 #define fba(i,b,a) for(int i=(b);i>=(a);i--) 15 #define MP make_pair 16 #define PB push_back 17 18 using namespace std; 19 const int N=2005; 20 class BigInteger{ 21 static const int MAX_LEN=2000;//允许最大位数 22 int d[MAX_LEN]; 23 int len;//位数 24 public: 25 BigInteger(int v=0){ 26 memset(d,0,sizeof(d));//初始化为0 27 len=0; 28 while(v){ 29 d[len++]=v%10; 30 v/=10; 31 } 32 if(len==0){ //值是0时特殊处理 33 len=1; 34 } 35 } 36 //+ 37 BigInteger operator + (const BigInteger other )const { 38 BigInteger ret; 39 ret.len=max(len,other.len); 40 rep(i,ret.len)ret.d[i]=d[i]+other.d[i];//忽略进位逐位相加 41 rep(i,ret.len){ 42 //进位 43 if(ret.d[i]>9){ 44 ret.d[i]-=10; 45 ret.d[i+1]++; 46 } 47 } 48 if(ret.d[ret.len]>0)ret.len++;//最高位进位 49 return ret; 50 } 51 //* 52 BigInteger operator* (const BigInteger other)const { 53 BigInteger ret; 54 ret.len = len+other.len-1; //两个数乘后总位数 55 rep(i,len){ 56 rep(j,other.len){ 57 //模拟乘法过程 58 ret.d[i+j]+=d[i]*other.d[j]; 59 } 60 } 61 rep(i,ret.len){ 62 if(ret.d[i]>9){ 63 ret.d[i+1]+=ret.d[i]/10; 64 ret.d[i]%=10; 65 } 66 } 67 if(ret.d[ret.len]>0)ret.len++; 68 //如果乘数是0,特殊处理,去掉前导0 69 while(ret.len>1&&ret.d[ret.len-1]==0)ret.len--; 70 return ret; 71 } 72 void print(){//输出 73 fba(i,len-1,0)cout<<d[i]; 74 cout<<endl; 75 } 76 77 }; 78 BigInteger dp[N][2]; 79 int main(){ 80 ios::sync_with_stdio(false); 81 int n,k; 82 cin>>n>>k; 83 k--; 84 memset(dp,0,sizeof(dp)); 85 dp[1][0]=1; 86 dp[1][1]=k; 87 for(int i=2;i<=n;i++){ 88 dp[i][0]=dp[i-1][1]; 89 dp[i][1]=(dp[i-1][0]+dp[i-1][1])*k; 90 } 91 dp[n][1].print(); 92 return 0; 93 }
简单大数模板(+ - )--待完善,布布扣,bubuko.com
标签:style blog class code java color
原文地址:http://www.cnblogs.com/wanggp3/p/3719901.html