cogs 99 查数

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;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值