Morass

Strange Game

May 16th, 2016
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define MX int(1e5+5)
  26. int l[MX],H[MX],C[MX][8],f[MX][8];
  27. void gen(void){
  28.     F(MX)H[i]=i;
  29.     for(int i(2);i<MX;++i)if(H[i]>1)
  30.         for(int j(i),c(0);j<MX;j+=i,c=0){
  31.             while(!(H[j]%i))H[j]/=i,++c;
  32.             if(c)C[j][l[j]]=c,f[j][l[j]++]=i;
  33.         }
  34. }
  35. ll MOD;
  36. ll pw(ll n,ll k){
  37.     ll r(1);
  38.     while(k){
  39.         if(k&1)
  40.             r*=n,r%=MOD;
  41.         n*=n,n%=MOD;
  42.         k>>=1;
  43.     }
  44.     return r;
  45. }
  46. int F[MX];
  47. ll sl(ll N,ll K,ll L,ll M){
  48.     if(!M)return pw(K,L);
  49.     CL(F,0);
  50.     ll S(1),U(max(L-M,M)),W(min(L-M,M)),A,B;
  51.     FT(U+1,L+1)F(l[k])F[f[k][i]]+=C[k][i];
  52.     FT(2,W+1)F(l[k])F[f[k][i]]-=C[k][i];
  53.     F(L+1)if(F[i])S*=pw(i,F[i]),S%=MOD;
  54.     if(!(K&1))A=(pw(K,L-1)*K/2)%MOD,B=pw(K-1,M);
  55.     else A=pw(K,L),B=(pw(K-1,M-1)*(K-1)/2)%MOD;
  56.     return (((S*A)%MOD)*B)%MOD;
  57. }
  58. int main(void){
  59.     ll N,K,L,M;
  60.     gen();
  61.     IN(tt)F(tt)
  62.         scanf("%lld%lld%lld%lld",&N,&K,&L,&M),MOD=N,
  63.         printf("Case %d: %lld\n",i+1,1+sl(N,K,L,M));
  64.     return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment