水了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
时间: 2024-10-27 04:42:43