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