简单大数模板(+ - )--待完善

水了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

简单大数模板(+ - )--待完善的相关文章

ACM大数模板(支持正负整数)

之前就保留过简陋的几个用外部数组变量实现的简单大数模板,也没有怎么用过,今天就想着整合封装一下,封装成C++的类,以后需要调用的时候也方便得多. 实现了基本的加减乘除和取模运算的操作符重载,大数除以大数难度太大就没实现,另外还实现了比较运算符,方便实际使用贴近内置类型的体验. 话不多说,贴代码. 1 #include <stdio.h> 2 #include <string.h> 3 #include <ctype.h> 4 5 #define MAXBIT 1007

大数模板

1 #include<stdio.h> 2 #include<string.h> 3 #include<conio.h> 4 #include<stdlib.h> 5 #include<time.h> 6 #define N 10000 7 // 大数模板... 8 class BigNum 9 { 10 public: 11 int s[N]; //存放各位数字,s[0]为符号位,1代表正数,-1代表负数 12 //数组内高位存高位,123存在

timus 1547. Password Search【题意思路+大数模板】

题目地址传送门:URAL 1547 这道题需要用到大数的很多模板,推荐大家去刷刷! 题目大意:Vova忘记了在Timus OJ上面的密码了,密码是由小写字母(a~z)组成的,他只知道密码长度不大于n位,现在他需要用m台数据处理器对密码进行检索,其中检索顺序需要满足字典序.比如他的密码长度不大于2,那就需要依次检索a,b,..........,y,z,aa,ab,..........,zy,zz.输出每台数据检索器的检索区间,使得总的检索效率可以达到最高. 已知密码的总可能数不少于数据处理器个数.

大数模板 poj3982

1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就好了,可是假设不能独立写出来的话,不相当于白搭吗.所以我学完c++后会手写出模板的!. 注意,这个大数模板仅仅适用于不太大的模拟,几万位,肯定会爆内存的,兴许会补上功能更强大的模板和JAVA大数模板. #include<iostream> #include<cstdio> #inclu

Acdream 1210 Chinese Girls&#39; Amusement(大数模板运算 + 找规律)

传送门 Chinese Girls' Amusement Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description You must have heard that the Chinese culture is quite different from that of Europe or Rus

socket 简单的模板

服务端: #!/usr/bin/python import socket s=socket.socket() host='10.67.15.96' port=889 s.bind((host,port)) s.listen(5) while True: c,addr=s.accept() print '++++++' c.send('server') b=c.recv(1024) print b c.close() 客户端: #!/usr/bin/python import socket s=s

vijos - P1447开关灯泡 (大数模板 + 找规律 + 全然数 + python)

P1447开关灯泡 Accepted 标签:CSC WorkGroup III[显示标签] 描写叙述 一个房间里有n盏灯泡.一開始都是熄着的,有1到n个时刻.每一个时刻i,我们会将i的倍数的灯泡改变状态(即原本开着的现将它熄灭,原本熄灭的现将它点亮),问最后有多少盏灯泡是亮着的. 格式 输入格式 一个数n 输出格式 m,表示最后有m盏是亮着的 例子1 例子输入1[复制] 5 例子输出1[复制] 2 限制 1s 提示 范围:40%的数据保证,n<=maxlongint 100%的数据保证,n<=

bignum 大数模板

今天无意间看到一个很好的大数模板,能算加.减.乘.除等基本运算,但操作减法的时候只能大数减小数,也不支持负数,如果是两个负数的话去掉符号相加之后再取反就可以了,一正一负比较绝对值大小,然后相减.我借用了一下:(作过少许代码上的精简) 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 #include<iostream> 6 using

Hdu 4762 网络赛 高精度大数模板+概率

注意题目中的这句话he put the strawberries on the cake randomly one by one,第一次选择草莓其实有N个可能,以某一个草莓为开头,然后顺序的随机摆放,所以最后的概率为n/m^(n-1),最后通过大数模板搞定该题的化简. C++代码 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<iomanip> 5 #include