记录编号 339981 评测结果 AAAAAAAAAA
题目名称 查数 最终得分 100
用户昵称 GravatarSmile 是否通过 通过
代码语言 C++ 运行时间 0.197 s
提交时间 2016-11-06 08:35:01 内存使用 4.20 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
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;
}快速幂 */

int pow(int x,int ci, int c)
{
	int re=1;
	while(ci>0)
	{
		if(ci&1)
		{
			re=(re*x)%c;
		}
		ci>>=1;
		x=(x*x)%c;
	}
	return re;
}

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