#include "message.h"
#include "futbol.h"
#include <vector>
#include <cstdio>
// 4 2 999999937
long long potega(long long l, long long m, long long a) {
if(l==0) {
return 0;
}
std::vector<long long> v;
v.push_back(l);
long long j;
for(j=1;j<=a;j*=2) {
v.push_back(v[v.size()-1]*v[v.size()-1]%m);
}
long long i;
long long odp=1;
i=v.size()-1;
for(;j>=0 && i>=0;j/=2) {
if(a>=j) {
odp=(odp*v[i])%m;
a-=j;
}
i--;
}
return odp;
}
long long mojmax(long long a, long long b) {
if(a>b) {
return a;
}
return b;
}
long long silnie[10][1000000];
long long silniepot[10][1000000];
int main() {
if(MyNodeId() != 0) return 0;
long long k,n,p;
long long i, mxkn,odp;
//scanf("%lld%lld%lld",&n,&k,&p);
n=GetN();
k=GetK();
p=GetP();
mxkn=mojmax(k,n-k);
silnie[0][0]=1%p;
silniepot[0][0]=silnie[0][0];
for(i=1;i<=n;i++) {
silnie[i/1000000][i%1000000]=(silnie[(i-1)/1000000][(i-1)%1000000]*i)%p;
silniepot[i/1000000][i%1000000]=potega(silnie[i/1000000][i%1000000], p, p-2);
}
odp=0;
for(i=0;i<=k;i++) {
odp=(odp+silniepot[i/1000000][i%1000000]*silniepot[(n-i)/1000000][(n-i)%1000000])%p;
// printf("%lld %lld\n", (silnie[n/1000000][n%1000000]*(silniepot[i/1000000][i%1000000]*silniepot[(n-i)/1000000][(n-i)%1000000]))%p);
}
odp=(odp*silnie[n/1000000][n%1000000])%p;
printf("%lld\n",odp);
return 0;
}
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 57 58 59 60 61 62 63 64 | #include "message.h" #include "futbol.h" #include <vector> #include <cstdio> // 4 2 999999937 long long potega(long long l, long long m, long long a) { if(l==0) { return 0; } std::vector<long long> v; v.push_back(l); long long j; for(j=1;j<=a;j*=2) { v.push_back(v[v.size()-1]*v[v.size()-1]%m); } long long i; long long odp=1; i=v.size()-1; for(;j>=0 && i>=0;j/=2) { if(a>=j) { odp=(odp*v[i])%m; a-=j; } i--; } return odp; } long long mojmax(long long a, long long b) { if(a>b) { return a; } return b; } long long silnie[10][1000000]; long long silniepot[10][1000000]; int main() { if(MyNodeId() != 0) return 0; long long k,n,p; long long i, mxkn,odp; //scanf("%lld%lld%lld",&n,&k,&p); n=GetN(); k=GetK(); p=GetP(); mxkn=mojmax(k,n-k); silnie[0][0]=1%p; silniepot[0][0]=silnie[0][0]; for(i=1;i<=n;i++) { silnie[i/1000000][i%1000000]=(silnie[(i-1)/1000000][(i-1)%1000000]*i)%p; silniepot[i/1000000][i%1000000]=potega(silnie[i/1000000][i%1000000], p, p-2); } odp=0; for(i=0;i<=k;i++) { odp=(odp+silniepot[i/1000000][i%1000000]*silniepot[(n-i)/1000000][(n-i)%1000000])%p; // printf("%lld %lld\n", (silnie[n/1000000][n%1000000]*(silniepot[i/1000000][i%1000000]*silniepot[(n-i)/1000000][(n-i)%1000000]))%p); } odp=(odp*silnie[n/1000000][n%1000000])%p; printf("%lld\n",odp); return 0; } |
English