记录编号 77815 评测结果 AAAAAAAAAA
题目名称 方程 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2013-11-02 18:24:53 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<vector>
using namespace std;
const int MOD=1000;
const int SIZEL=1000;
const int SIZEP=1000;
int K,X;
class HPINT{
public:
	int len;
	int s[SIZEL];
	HPINT(){
		memset(s,0,sizeof(s));
	}
	void mul(int);
	void assign_one(void){
		len=1;
		s[0]=1;
	}
	void output(void){
		int i;
		for(i=len-1;i>=0;i--) printf("%d",s[i]);
	}
};
void HPINT::mul(int x){//*=x
	int i;
	for(i=0;i<len;i++) s[i]*=x;
	for(i=0;i<len||s[i];i++){
		s[i+1]+=s[i]/10;
		s[i]%=10;
	}
	len=max(len,i);
	while(!s[len-1]) len--;
}
int quickpow(int a,int n){
	int ans=1;
	while(n){
		if(n&1) ans*=a,ans%=MOD;
		a*=a,a%=MOD;
		n>>=1;
	}
	return ans%MOD;
}
bool flag[SIZEP+1]={1};//值为false代表它是素数
vector<int> prime;
void getprime(void){
	int i,j;
	int high=(int)sqrt((double)SIZEP);
	for(i=2;i<=high;i++){
		if(!flag[i]){
			for(j=i*i;j<=SIZEP;j+=i){
				flag[j]=true;
			}
		}
	}
	for(i=2;i<=SIZEP;i++) if(!flag[i]) prime.push_back(i);
}
void init(void){
	cin>>K>>X;
	X%=MOD;
	X=quickpow(X,X);
}
void getfact(int x,int p[]){//将x质因数分解,p中加上相应的指数
	int i;
	for(i=0;i<prime.size();i++){
		while(x%prime[i]==0){
			p[prime[i]]++;
			x/=prime[i];
		}
		if(x<=1) return;
	}
}
HPINT C(int n,int m){//n取m的高精
	int mol[SIZEP+1]={0},den[SIZEP+1]={0};//分子和分母的各素因子指数
	int i;
	for(i=n-m+1;i<=n;i++) getfact(i,mol);//分子
	for(i=1;i<=m;i++) getfact(i,den);
	for(i=1;i<=SIZEP;i++) mol[i]-=den[i];
	HPINT ans;
	ans.assign_one();
	int j;
	for(i=1;i<=SIZEP;i++){
		if(mol[i]){
			for(j=1;j<=mol[i];j++) ans.mul(i);
		}
	}
	return ans;
}
void work(void){
	HPINT ans=C(X-1,K-1);
	ans.output();cout<<endl;
}
int main(){
	freopen("equationz.in","r",stdin);
	freopen("equationz.out","w",stdout);
	getprime();
	init();
	work();
	return 0;
}