結果
問題 | No.1648 Sum of Powers |
ユーザー |
![]() |
提出日時 | 2021-08-13 22:43:23 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 61 ms / 2,000 ms |
コード長 | 16,049 bytes |
コンパイル時間 | 2,852 ms |
コンパイル使用メモリ | 226,880 KB |
最終ジャッジ日時 | 2025-01-23 20:26:43 |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 56 |
コンパイルメッセージ
In destructor ‘Matrix<T>::~Matrix() [with T = Modint]’, inlined from ‘int main()’ at main.cpp:816:1: main.cpp:423:7: warning: ‘pw.Matrix<Modint>::dat’ may be used uninitialized [-Wmaybe-uninitialized] 423 | delete [] dat; | ^~~~~~~~~~~~~ main.cpp: In function ‘int main()’: main.cpp:784:18: note: ‘pw.Matrix<Modint>::dat’ was declared here 784 | Matrix<Modint> pw; | ^~
ソースコード
#pragma GCC optimize("Ofast")#pragma GCC optimize("unroll-loops")#pragma GCC optimize("inline")#include<bits/stdc++.h>using namespace std;#define MD (998244353U)template<class T> struct cLtraits_identity{using type = T;};template<class T> using cLtraits_try_make_signed =typename conditional<is_integral<T>::value,make_signed<T>,cLtraits_identity<T>>::type;template <class S, class T> struct cLtraits_common_type{using tS = typename cLtraits_try_make_signed<S>::type;using tT = typename cLtraits_try_make_signed<T>::type;using type = typename common_type<tS,tT>::type;};void*wmem;char memarr[96000000];template<class S, class T> inline auto min_L(S a, T b)-> typename cLtraits_common_type<S,T>::type{return (typename cLtraits_common_type<S,T>::type) a <= (typename cLtraits_common_type<S,T>::type) b ? a : b;}struct Rand{unsigned x;unsigned y;unsigned z;unsigned w;Rand(void){x=123456789;y=362436069;z=521288629;w=(unsigned)time(NULL);}Rand(unsigned seed){x=123456789;y=362436069;z=521288629;w=seed;}inline unsigned get(void){unsigned t;t = (x^(x<<11));x=y;y=z;z=w;w = (w^(w>>19))^(t^(t>>8));return w;}inline double getUni(void){return get()/4294967296.0;}inline int get(int a){return (int)(a*getUni());}inline int get(int a, int b){return a+(int)((b-a+1)*getUni());}inline long long get(long long a){return(long long)(a*getUni());}inline long long get(long long a, long long b){return a+(long long)((b-a+1)*getUni());}inline double get(double a, double b){return a+(b-a)*getUni();}inline int getExp(int a){return(int)(exp(getUni()*log(a+1.0))-1.0);}inline int getExp(int a, int b){return a+(int)(exp(getUni()*log((b-a+1)+1.0))-1.0);}};struct Modint{unsigned val;Modint(){val=0;}Modint(int a){val = ord(a);}Modint(unsigned a){val = ord(a);}Modint(long long a){val = ord(a);}Modint(unsigned long long a){val = ord(a);}inline unsigned ord(unsigned a){return a%MD;}inline unsigned ord(int a){a %= (int)MD;if(a < 0){a += MD;}return a;}inline unsigned ord(unsigned long long a){return a%MD;}inline unsigned ord(long long a){a %= (int)MD;if(a < 0){a += MD;}return a;}inline unsigned get(){return val;}inline Modint &operator++(){val++;if(val >= MD){val -= MD;}return *this;}inline Modint &operator--(){if(val == 0){val = MD - 1;}else{--val;}return *this;}inline Modint operator++(int a){Modint res(*this);val++;if(val >= MD){val -= MD;}return res;}inline Modint operator--(int a){Modint res(*this);if(val == 0){val = MD - 1;}else{--val;}return res;}inline Modint &operator+=(Modint a){val += a.val;if(val >= MD){val -= MD;}return *this;}inline Modint &operator-=(Modint a){if(val < a.val){val = val + MD - a.val;}else{val -= a.val;}return *this;}inline Modint &operator*=(Modint a){val = ((unsigned long long)val*a.val)%MD;return *this;}inline Modint &operator/=(Modint a){return *this *= a.inverse();}inline Modint operator+(Modint a){return Modint(*this)+=a;}inline Modint operator-(Modint a){return Modint(*this)-=a;}inline Modint operator*(Modint a){return Modint(*this)*=a;}inline Modint operator/(Modint a){return Modint(*this)/=a;}inline Modint operator+(int a){return Modint(*this)+=Modint(a);}inline Modint operator-(int a){return Modint(*this)-=Modint(a);}inline Modint operator*(int a){return Modint(*this)*=Modint(a);}inline Modint operator/(int a){return Modint(*this)/=Modint(a);}inline Modint operator+(long long a){return Modint(*this)+=Modint(a);}inline Modint operator-(long long a){return Modint(*this)-=Modint(a);}inline Modint operator*(long long a){return Modint(*this)*=Modint(a);}inline Modint operator/(long long a){return Modint(*this)/=Modint(a);}inline Modint operator-(void){Modint res;if(val){res.val=MD-val;}else{res.val=0;}return res;}inline operator bool(void){return val!=0;}inline operator int(void){return get();}inline operator long long(void){return get();}inline Modint inverse(){int a = val;int b = MD;int u = 1;int v = 0;int t;Modint res;while(b){t = a / b;a -= t * b;swap(a, b);u -= t * v;swap(u, v);}if(u < 0){u += MD;}res.val = u;return res;}inline Modint pw(unsigned long long b){Modint a(*this);Modint res;res.val = 1;while(b){if(b&1){res *= a;}b >>= 1;a *= a;}return res;}inline bool operator==(int a){return ord(a)==val;}inline bool operator!=(int a){return ord(a)!=val;}};inline Modint operator+(int a, Modint b){return Modint(a)+=b;}inline Modint operator-(int a, Modint b){return Modint(a)-=b;}inline Modint operator*(int a, Modint b){return Modint(a)*=b;}inline Modint operator/(int a, Modint b){return Modint(a)/=b;}inline Modint operator+(long long a, Modint b){return Modint(a)+=b;}inline Modint operator-(long long a, Modint b){return Modint(a)-=b;}inline Modint operator*(long long a, Modint b){return Modint(a)*=b;}inline Modint operator/(long long a, Modint b){return Modint(a)/=b;}inline int my_getchar_unlocked(){static char buf[1048576];static int s = 1048576;static int e = 1048576;if(s == e && e == 1048576){e = fread_unlocked(buf, 1, 1048576, stdin);s = 0;}if(s == e){return EOF;}return buf[s++];}inline void rd(int &x){int k;int m=0;x=0;for(;;){k = my_getchar_unlocked();if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){x=k-'0';break;}}for(;;){k = my_getchar_unlocked();if(k<'0'||k>'9'){break;}x=x*10+k-'0';}if(m){x=-x;}}inline void rd(Modint &x){int i;rd(i);x=i;}struct MY_WRITER{char buf[1048576];int s;int e;MY_WRITER(){s = 0;e = 1048576;}~MY_WRITER(){if(s){fwrite_unlocked(buf, 1, s, stdout);}}};MY_WRITER MY_WRITER_VAR;void my_putchar_unlocked(int a){if(MY_WRITER_VAR.s == MY_WRITER_VAR.e){fwrite_unlocked(MY_WRITER_VAR.buf, 1, MY_WRITER_VAR.s, stdout);MY_WRITER_VAR.s = 0;}MY_WRITER_VAR.buf[MY_WRITER_VAR.s++] = a;}inline void wt_L(char a){my_putchar_unlocked(a);}inline void wt_L(long long x){int s=0;int m=0;char f[20];if(x<0){m=1;x=-x;}while(x){f[s++]=x%10;x/=10;}if(!s){f[s++]=0;}if(m){my_putchar_unlocked('-');}while(s--){my_putchar_unlocked(f[s]+'0');}}template<class T> struct Matrix{int r;int c;int mem;T*dat;Matrix(){r=c=mem = 0;}Matrix(const int rr, const int cc){if(rr == 0 || cc == 0){r = c = 0;}else{r = rr;c = cc;}mem = r * c;if(mem > 0){dat = new T[mem];}}Matrix(const Matrix<T> &a){int i;r = a.r;c = a.c;mem = r * c;dat = new T[mem];for(i=(0);i<(mem);i++){dat[i] = a.dat[i];}}~Matrix(){if(mem){delete [] dat;}}void changeSize(const int rr, const int cc){if(rr==0 || cc==0){r = c = 0;}else{r = rr;c = cc;}if(mem < r*c){if(mem){delete [] dat;}mem = r*c;dat = new T[mem];}}Matrix<T>& operator=(const Matrix<T> &a){int i;int j;r = a.r;c = a.c;j = r * c;changeSize(r,c);for(i=(0);i<(j);i++){dat[i] = a.dat[i];}return *this;}Matrix<T>& operator=(const int a){int i;int j;j = r * c;for(i=(0);i<(j);i++){dat[i] = 0;}j =min_L(r, c);for(i=(0);i<(j);i++){dat[i*c+i] = a;}return *this;}Matrix<T>& operator+=(const Matrix<T> &a){int i;int j;if(r==0 || r!=a.r || c!=a.c){changeSize(0,0);return *this;}j = r*c;for(i=(0);i<(j);i++){dat[i] += a.dat[i];}return *this;}Matrix<T> operator+(const Matrix<T> &a){return Matrix<T>(*this) += a;}Matrix<T>& operator-=(const Matrix<T> &a){int i;int j;if(r==0 || r!=a.r || c!=a.c){changeSize(0,0);return *this;}j = r*c;for(i=(0);i<(j);i++){dat[i] -= a.dat[i];}return *this;}Matrix<T> operator-(const Matrix<T> &a){return Matrix<T>(*this) -= a;}Matrix<T>& operator*=(const Matrix<T> &a){int i;int j;int k;int x;T*m;if(r==0 || c!=a.r){changeSize(0,0);return *this;}m = (T*)wmem;x = r * a.c;for(i=(0);i<(x);i++){m[i] = 0;}for(i=(0);i<(r);i++){for(k=(0);k<(c);k++){for(j=(0);j<(a.c);j++){m[i*a.c+j] += dat[i*c+k] * a.dat[k*a.c+j];}}}changeSize(r, a.c);for(i=(0);i<(x);i++){dat[i] = m[i];}return *this;}Matrix<T> operator*(const Matrix<T> &a){return Matrix<T>(*this) *= a;}Matrix<T>& operator*=(const int a){int i;int j;j = r * c;for(i=(0);i<(j);i++){dat[i] *= a;}return *this;}Matrix<T>& operator*=(const long long a){int i;int j;j = r * c;for(i=(0);i<(j);i++){dat[i] *= a;}return *this;}Matrix<T>& operator*=(const double a){int i;int j;j = r * c;for(i=(0);i<(j);i++){dat[i] *= a;}return *this;}inline T* operator[](const int a){return dat+a*c;}};template<class T> Matrix<T> operator*(const int a, const Matrix<T> &b){return Matrix<T>(b)*=a;}template<class T> Matrix<T> operator*(const Matrix<T> &b, const int a){return Matrix<T>(b)*=a;}template<class T> Matrix<T> operator*(const long long a, const Matrix<T> &b){return Matrix<T>(b)*=a;}template<class T> Matrix<T> operator*(const Matrix<T> &b, const long long a){return Matrix<T>(b)*=a;}template<class T> Matrix<T> operator*(const double a, const Matrix<T> &b){return Matrix<T>(b)*=a;}template<class T> Matrix<T> operator*(const Matrix<T> &b, const double a){return Matrix<T>(b)*=a;}template<class T, class S> inline Matrix<T> pow_L(Matrix<T> a, S b){int i;int j;Matrix<T> res;res.changeSize(a.r, a.c);res = 1;while(b){if(b&1){res *= a;}b >>= 1;a *= a;}return res;}template<class T, class S> inline T pow_L(T a, S b){T res = 1;res = 1;for(;;){if(b&1){res *= a;}b >>= 1;if(b==0){break;}a *= a;}return res;}inline double pow_L(double a, double b){return pow(a,b);}unsigned long long HashMap_ullP_L[4];template<class KEY, class VAL> struct HashMap{char*used;KEY*key;VAL*val;int mem;int n;int mask;int init_flag;VAL init_val;HashMap(){mem = 0;init_flag = 0;}~HashMap(){free();}void expand(int nn){if(mem >= nn){return;}if(mem){free();}mem = nn;used = new char[nn];key = new KEY[nn];val = new VAL[nn];}void free(){if(mem){mem = 0;delete[] used;delete[] key;delete[] val;}}void init(int nn){int i;n = 1;nn = nn + (nn + 1) / 2;while(n < nn){n *= 2;}mask = n - 1;expand(n);for(i=(0);i<(n);i++){used[i] = 0;}init_flag = 0;}void init(int nn, VAL ini){int i;n = 1;nn = nn + (nn + 1) / 2;while(n < nn){n *= 2;}mask = n - 1;expand(n);for(i=(0);i<(n);i++){used[i] = 0;}init_flag = 1;init_val = ini;}inline int getHash(const int a){unsigned long long d = a;d = (((d * HashMap_ullP_L[0]) >> 32) * HashMap_ullP_L[1]) & mask;return d;}inline int getHash(const unsigned a){unsigned long long d = a;d = (((d * HashMap_ullP_L[0]) >> 32) * HashMap_ullP_L[1]) & mask;return d;}inline int getHash(const long long a){unsigned long long d = a;d = (((((d * HashMap_ullP_L[0]) >> 32) * HashMap_ullP_L[1]) >> 32) * HashMap_ullP_L[2]) & mask;return d;}inline int getHash(const unsigned long long a){unsigned long long d = a;d = (((((d * HashMap_ullP_L[0]) >> 32) * HashMap_ullP_L[1]) >> 32) * HashMap_ullP_L[2]) & mask;return d;}inline int getHash(const pair<int,int> a){unsigned long long d = (((unsigned long long)a.first) << 32) + ((unsigned long long)a.second);d = (((((d * HashMap_ullP_L[0]) >> 32) * HashMap_ullP_L[1]) >> 32) * HashMap_ullP_L[2]) & mask;return d;}inline VAL& operator[](const KEY a){int k = getHash(a);for(;;){if(used[k]==1 && key[k]==a){break;}if(used[k]==0){used[k] = 1;key[k] = a;if(init_flag){val[k] = init_val;}break;}k = (k+1) & mask;}return val[k];}inline bool exist(const KEY a){int k = getHash(a);for(;;){if(used[k]==1 && key[k]==a){return true;}if(used[k]==0){break;}k = (k+1) & mask;}return false;}template<class S> inline bool exist(const KEY a, S &res){int k = getHash(a);for(;;){if(used[k]==1 && key[k]==a){res = val[k];return true;}if(used[k]==0){break;}k = (k+1) & mask;}return false;}};int main(){wmem = memarr;{int i;int j;int k;Rand rnd;for(i=(0);i<(20);i++){rnd.get(2);}for(i=(0);i<(4);i++){for(j=(0);j<(32);j++){k = rnd.get(1,62);HashMap_ullP_L[i] |= (1ULL << k);}HashMap_ullP_L[i] |= (1ULL << 0);HashMap_ullP_L[i] |= (1ULL << 63);}}long long i;long long res;Modint A;rd(A);Modint B;rd(B);Modint P;rd(P);Modint Q;rd(Q);Modint x;Modint y;Modint t;Matrix<Modint> mt(2,2);Matrix<Modint> pw;HashMap<pair<int,int>,int> hs;hs.init(100000);for(i=(0);i<(100000);i++){hs[{P,Q}] = i;if(B==0){t = Q / A;}else{t = (A*Q - P) / B;}auto Q5VJL1cS = ((Q));auto e98WHCEY = (( t));P=Q5VJL1cS;Q=e98WHCEY;}mt = 0;mt[0][0] = A;mt[0][1] = -B;mt[1][0] = 1;for(i=0;;i++){pw =(pow_L(mt,(i * 100000)));x = pw[0][0] * A + pw[0][1] * 2;y = pw[1][0] * A + pw[1][1] * 2;if(hs.exist({x,y})){res = i * 100000 + hs[{x,y}] + 1;wt_L(res);wt_L('\n');break;}}return 0;}// cLay version 20210717-1 [beta]// --- original code ---// #define MD 998244353// {// ll i, res;// Modint @A, @B, @P, @Q, x, y, t;// Matrix<Modint> mt(2,2), pw;// HashMap<pair<int,int>,int> hs;// hs.init(1d5);//// rep(i,1d5){// hs[{P,Q}] = i;// if(B==0) t = Q / A;// else t = (A*Q - P) / B;// (P, Q) = (Q, t);// }//// mt = 0;// mt[0][0] = A;// mt[0][1] = -B;// mt[1][0] = 1;//// for(i=0;;i++){// pw = mt ** (i * 1d5);// x = pw[0][0] * A + pw[0][1] * 2;// y = pw[1][0] * A + pw[1][1] * 2;// if(hs.exist({x,y})){// res = i * 1d5 + hs[{x,y}] + 1;// wt(res);// break;// }// }//// }