99. 查数
★☆ 输入文件:chashu.in
输出文件:
chashu.out
简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
在所有的N位数中,有多少个数中有偶数个数字3?
在所有的N位数中,有多少个数中有偶数个数字3?
【输入格式】
文件只有一行为一个正整数n
文件只有一行为一个正整数n
【输出格式】
输出文件只有一个整数,方案数(由于结果可能很大,你只需要输出这个答案mod 12345的值。)。
输出文件只有一个整数,方案数(由于结果可能很大,你只需要输出这个答案mod 12345的值。)。
【输入输出样例】
输入:
chashu.in
2
输入:
chashu.in
2
输出:
chashu.out
73
chashu.out
73
数据规模:1<=N<=1000
利用组合数学搞一搞就出来了, 代码中有解释;
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
const int maxn=1000+10;
const int MOD=12345;
int c[maxn][maxn];
int n, ans;
int pow(int a, int b, int c) {
if(!b) return 1;
int x=pow(a, b/2, c);
LL ans=(x*x)%c;
if(b%2==1) ans=(ans*a)%c;
return (int) ans;
}//快速幂
void Getc(int n) {
for(int i=0; i<=n; i++) c[i][0]=1;
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%MOD;
}
}//利用公式c[n][k]=c[n-1][k]+c[n-1][k-1] 求所有c[i][j];
int main() {
freopen("chashu.in","r",stdin);
freopen("chashu.out","w",stdout);
cin>>n;
Getc(n);
//i枚举的是3的个数;
for(int i=2; i<=n; i+=2) {
for(int j=1; n-j>=i-1; j++) {
int tmp=c[n-j][i-1];
if(j==1) {
ans=(ans+tmp*pow(9, n-i, MOD))%MOD;
}
else {
ans=(ans+tmp*pow(9, n-i-1, MOD)*8)%MOD;
}
}// j枚举的是第一个3的位置,然后就是从n-j个数中选i-1个数作为3(c[n-j][i-1]);
//由于首位不能为0, 所以j==1要特判(这就是j存在的意义);
}
ans=(ans+8*pow(9, n-1, MOD))%MOD; //加上0个3的情况;
cout<<ans;
return 0;
}