在所有的N位数中,有多少个数中有偶数个数字3(说明,0是偶数)?
【输入格式】 读入一个数N
【输出格式】 输出有多少个数中有偶数个数字3。
【输入样例】 2
【输出样例】 73(由于 位数 比较大的情况下,导致输出数据可能越界,因此,输出个数 % 12345 的结果)
【数据规模】 1<=N<=1000
暴力统计
int main()
{
int sum=0;
int n;
cin>>n;
if(n==1)
{
cout<<9<<endl;
return 0;
}
for(int i=pow(10,n-1);i<pow(10,n);i++){
int cnt =0; //统计有i中有几个3
int t=i;
while(t){
if(t%10==3){
cnt++;
}
t=t/10;
}
// 如果3的个数是2的倍数,就满足条件.
if(cnt%2==0){
sum++;
sum%=12345;
}
}
cout<<sum<<endl;
return 0;
}
递推
//列举、地推
//c
//c中奇数个3 只有1个3:3
//c中偶数个3 含有0个3的有9个:0,1,2,4,5,6,7,8,9,
//c[1][0] = 9 c[i][j] i前i位,j有0,1两个状态,0存前i位含偶数个3的数量,1存前i位含奇数个3的数量。
//c[1][1] = 1
//如果i不是最高位 那么i范围是0~9有10位数,是最高位只能1~9有9位数。
//bc,有以下两种情况
//c中奇数个3 那么 b中 应该选取 奇数个3 奇+奇=偶
//c中偶数数个3 那么 b中 应该选取 偶数个3 偶+偶=偶
// bc[2][0] =c[1][1] +c[1][0]*8 其中b为最高位时,1~9,不是3的只有8个
// bc[2][1] =c[1][1]*8+c[1][0] 其中b为最高位时,1~9,不是3的只有8个
// abc
//要保证abc有偶数个三,有以下两种情况
//bc中奇数个3 那么 a中 应该选取 3 奇+奇=偶
//bc中偶数数个3 那么 a中 应该选取 偶数个3 偶+偶=偶
//而要继续推abc,则之前的bc中b相对a,就不再是最高位,那么之前的b应该有0~9,所以8改9
//bc[2][0] =c[1][1] +c[1][0]*9
//bc[2][1] =c[1][1]*9+c[1][0]
//abc[3][0] = bc[1][1] +bc[1][0]*8 当前 a是最高位,范围1~9选取8
//abc[3][1] = bc[1][1]*8 +bc[1][0]
// abc 、bc、c,统称f
#include<iostream>
using namespace std;
int main(){
int f[1001][2];
int n,x;
cin>>n;
f[1][1]=1;
f[1][0]=9;
for(int i=2;i<=n;i++){
x=9;
if(i==n)
x--;
f[i][0]=f[i-1][1]+f[i-1][0]*x;
f[i][1]=f[i-1][1]*x+f[i-1][0];
}
cout<<f[n][0]%12345;
return 0;
}