Description
Let’s consider K-based numbers, containing exactly N digits. We define a number to be valid if its K-based notation doesn’t contain two successive
zeros. For example:
- 1010230 is a valid 7-digit number;
- 1000198 is not a valid number;
- 0001235 is not a 7-digit number, it is a 4-digit number.
Given two numbers N and K, you are to calculate an amount of valid K based numbers, containing N digits.
You may assume that 2 ≤ K ≤ 10; N ≥ 2; N + K ≤ 1800.
Input
The numbers N and K in decimal notation separated by the line break.
Output
The result in decimal notation.
Sample Input
input | output |
---|---|
2 10 |
90 |
因为N+K<=1800,所以要用到高精度加法还有乘法,至于规律还是跟前一道一样。因为加法写错WA了好多次= =
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int digit[10000];
string stri[10000];
string mul(string str,int a){
memset(digit,0,sizeof(digit));
int jinwei=0,n=0;
int len=str.length();
for(int i=len-1; i >= 0; i--){
digit[n++]=((str[i]-'0')*a+jinwei)%10;
jinwei=((str[i]-'0')*a+jinwei)/10;
}
while(jinwei!=0){
digit[n++]=jinwei%10;
jinwei /= 10;
}
string st;
for(int i=n-1; i >= 0; i--)
st+=(digit[i]+'0');
return st;
}
string add(string st1,string st2){
int len1=st1.length()-1;
int len2=st2.length()-1;
int jinwei=0,n=0;
memset(digit,0,sizeof(digit));
while(len1>=0&&len2>=0){
digit[n++]=(st1[len1]-'0'+st2[len2]-'0'+jinwei)%10;
jinwei=(st1[len1]-'0'+st2[len2]-'0'+jinwei)/10;
len1--;
len2--;
}
for(int i=len1; i >= 0; i--){
digit[n++]=(st1[i]-'0'+jinwei)%10;
jinwei=(st1[i]-'0'+jinwei)/10;
}
for(int i=len2; i >= 0; i--){
digit[n++]=(st2[i]-'0'+jinwei)%10;
jinwei=(st2[i]-'0'+jinwei)/10;
}
string st;
if(jinwei!=0) st+=(jinwei+'0');
for(int i=n-1; i >= 0; i--)
st+=(digit[i]+'0');
return st;
}
string tostr(int i){
int n=0;
while(i!=0){
digit[n++]=i%10;
i/=10;
}
string st;
for(int i=n-1; i >= 0; i--)
st+=(digit[i]+'0');
return st;
}
int main()
{
int n;
int k;
cin >> n >> k;
stri[1]=tostr(k-1);
stri[2]=mul(tostr(k),k-1);
for(int i=3; i <= n; i++)
stri[i]=mul(add(stri[i-1],stri[i-2]),k-1);
cout << stri[n] << endl;
}