1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <stdio.h>
#define MOD 1234567891 #define MAX_N 1000000 #define ll long long ll FACT[MAX_N+1]; ll REFACT[MAX_N+1]; ll getPOWED(ll N, ll P){ ll result = 1; do{ if(P&1==1){ result *= N; result %= MOD; } N *= N; N %= MOD; }while(P>>=1); return result; } int main(int argc, char** argv) { int N,R,i; scanf("%d %d",&N,&R); FACT[1] = 1; for(i = 2; i<=N; i++) FACT[i] = (FACT[i-1]*i)%MOD; REFACT[MAX_N] = getPOWED(FACT[MAX_N],MOD-2); R = N-R > R ? R : N-R; for(i=MAX_N-1; i>=R; i--) REFACT[i] = (REFACT[i+1]*(i+1))%MOD; printf("%llu\n",i,(((FACT[N] * REFACT[R])%MOD)*REFACT[N-R])%MOD); }
|