#include<bits/stdc++.h> using namespace std; long long n,m,p,i,dl,x,zmienna,odp,dlugosc; int tab[101001000]; long long sum [10010010]; bool rozklad[31]; long long Potegowanie (int a) { long long pot; int j; long long odpowiedz=1; pot=a; if (rozklad[0]==true) { odpowiedz=a; } for (j=1;j<=dlugosc;j++) { pot=(pot*pot)%p; if (rozklad[j]==true) { odpowiedz=(odpowiedz*pot) % p; } } //cout<<"wejscie="<<a<<" wyjscie="<<odpowiedz<<'\n'; return odpowiedz; } int main () { ios_base::sync_with_stdio(false); cin>>m>>n>>p; m--; zmienna=m; dlugosc=0; while (zmienna>0) { //cout<<zmienna<<'\n'; if (zmienna % 2==1) { rozklad[dlugosc]=true; } dlugosc++; zmienna/=2; } for (i=1;i<=n;i++) { sum[i]=sum[i-1]+i % p; } x=0; for (dl=1;dl<=n;dl++) { for (i=0;i+dl<=n;i++) { x++; tab[x]=sum[n]-sum[i]-sum[n-i-dl]; while (tab[x]<0) { tab[x]+=p; } //cout<<"dl="<<dl<<" i="<<i<<" tab="<<tab[x]<<'\n'; } } for (i=1;i<=x;i++) { odp=(odp+Potegowanie(tab[i])) % p; //cout<<"odp="<<odp<<'\n'; } cout<<odp<<'\n'; 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 65 66 67 68 69 70 71 72 | #include<bits/stdc++.h> using namespace std; long long n,m,p,i,dl,x,zmienna,odp,dlugosc; int tab[101001000]; long long sum [10010010]; bool rozklad[31]; long long Potegowanie (int a) { long long pot; int j; long long odpowiedz=1; pot=a; if (rozklad[0]==true) { odpowiedz=a; } for (j=1;j<=dlugosc;j++) { pot=(pot*pot)%p; if (rozklad[j]==true) { odpowiedz=(odpowiedz*pot) % p; } } //cout<<"wejscie="<<a<<" wyjscie="<<odpowiedz<<'\n'; return odpowiedz; } int main () { ios_base::sync_with_stdio(false); cin>>m>>n>>p; m--; zmienna=m; dlugosc=0; while (zmienna>0) { //cout<<zmienna<<'\n'; if (zmienna % 2==1) { rozklad[dlugosc]=true; } dlugosc++; zmienna/=2; } for (i=1;i<=n;i++) { sum[i]=sum[i-1]+i % p; } x=0; for (dl=1;dl<=n;dl++) { for (i=0;i+dl<=n;i++) { x++; tab[x]=sum[n]-sum[i]-sum[n-i-dl]; while (tab[x]<0) { tab[x]+=p; } //cout<<"dl="<<dl<<" i="<<i<<" tab="<<tab[x]<<'\n'; } } for (i=1;i<=x;i++) { odp=(odp+Potegowanie(tab[i])) % p; //cout<<"odp="<<odp<<'\n'; } cout<<odp<<'\n'; return 0; } |