cogs 99 查数

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34004420/article/details/53053445

99. 查数

★☆   输入文件:chashu.in   输出文件:chashu.out   简单对比
时间限制:1 s   内存限制:128 MB
【问题描述】
    在所有的N位数中,有多少个数中有偶数个数字3?
 
【输入格式】 
     文件只有一行为一个正整数n
 
【输出格式】 
     输出文件只有一个整数,方案数(由于结果可能很大,你只需要输出这个答案mod 12345的值。)。
 
【输入输出样例】
 
输入: 
chashu.in
2
输出:
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;
}


展开阅读全文

没有更多推荐了,返回首页