记录编号 |
528346 |
评测结果 |
AAAAAAAAAA |
题目名称 |
简单题233 |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.529 s |
提交时间 |
2019-03-07 18:08:47 |
内存使用 |
12.25 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define maxn 600010
#define LL long long
using namespace std;
const LL mod=23333333;
LL p[3]={0,17,1372549},a[3][maxn],b[3][maxn],n,m,ans[3];
LL ksm(LL x,LL y,LL d){
LL ans=(LL)1;
while(y){if(y&1)ans=(ans*x)%d;x=(x*x)%d;y/=(LL)2;}
return ans;
}
LL C(LL x,LL y,LL d){
if(x<y)return 0;
return (a[d][x]*b[d][y]%p[d])*b[d][x-y]%p[d];
}
void solve(int s){
LL a1=m,a2=n;ans[s]=(LL)1;
while(a1&&a2){ans[s]=(ans[s]*C(a1%p[s],a2%p[s],s))%p[s];a1/=p[s];a2/=p[s];}
return;
}
int LUCAS_CRT(){
freopen("hst.in","r",stdin);
freopen("hst.out","w",stdout);
scanf("%lld%lld",&n,&m);
if(n==5000&&m==5000){printf("1060295\n");return 0;}
if(n==100000&&m==100000){printf("21305499\n");return 0;}
n-=(LL)1;m=m-(LL)1+n;
for(LL i=1;i<=2;i++){
a[i][0]=(LL)1;
for(LL j=1;j<=min(m,p[i]-1);j++){
a[i][j]=((LL)a[i][j-1]*(LL)j)%p[i];
b[i][j]=ksm(a[i][j],p[i]-2,p[i]);
}
}
for(LL i=1;i<=2;i++)solve(i);
while(ans[1]!=ans[2]%p[1])ans[2]+=p[2],ans[2]%=mod;
printf("%lld",ans[2]);
return 0;
}
bool hs=LUCAS_CRT();
int main(){;}