結果
問題 | No.2007 Arbitrary Mod (Easy) |
ユーザー |
|
提出日時 | 2022-07-15 21:21:33 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 4,657 bytes |
コンパイル時間 | 2,350 ms |
コンパイル使用メモリ | 201,072 KB |
最終ジャッジ日時 | 2025-01-30 07:18:22 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
#include<bits/stdc++.h>using namespace std;using ll=long long;using P=pair<ll,ll>;// mod functionll mod(ll a, ll mod) {return (a%mod+mod)%mod;}ll modpow(ll a,ll n,ll mod){ll res=1;a%=mod;while (n>0){if (n & 1) res*=a;a *= a;a%=mod;n >>= 1;res%=mod;}return res;}vector<P> prime_factorize(ll N) {vector<P> res;for (ll a = 2; a * a <= N; ++a) {if (N % a != 0) continue;ll ex = 0;while(N % a == 0){++ex;N /= a;}res.push_back({a, ex});}if (N != 1) res.push_back({N, 1});return res;}ll modinv(ll a, ll mod) {ll b = mod, u = 1, v = 0;while (b) {ll t = a/b;a -= t * b, swap(a, b);u -= t * v, swap(u, v);}u %= mod;if (u < 0) u += mod;return u;}ll extGcd(ll a, ll b, ll &p, ll &q) {if (b == 0) { p = 1; q = 0; return a; }ll d = extGcd(b, a%b, q, p);q -= a/b * p;return d;}P ChineseRem(const vector<ll> &b, const vector<ll> &m) {ll r = 0, M = 1;for (int i = 0; i < (int)b.size(); ++i) {ll p, q;ll d = extGcd(M, m[i], p, q);if ((b[i] - r) % d != 0) return make_pair(0, -1);ll tmp = (b[i] - r) / d * p % (m[i]/d);r += M * tmp;M *= m[i]/d;}return make_pair(mod(r, M), M);}template<int m> struct Comb{unordered_map<int,tuple<ll,vector<ll>,vector<ll>>> mp;int n_;ll p_, pm_;vector<ll> ord_, fact_;vector<P> pf;Comb(int n) : n_(n), ord_(n), fact_(n){pf=prime_factorize(m);COMinit();}void init(int n) {ord_.resize(n);fact_.resize(n);}void init(long long p, long long pm) {p_=p,pm_=pm;ord_[0]=ord_[1]=0;fact_[0]=fact_[1]=1;auto&[pms,ord,fac]=mp[p];pms=pm;ord.resize(n_);fac.resize(n_);ord[0]=ord[1]=0;fac[0]=fac[1]=1;for (int i=2;i<n_;i++) {long long add=0;long long ni=i;while (ni % p == 0) add++,ni/=p;ord_[i]=ord_[i-1]+add;fact_[i]=fact_[ni-1]*ni%pm;ord[i]=ord_[i];fac[i]=fact_[i];}}void init(long long p, long long pm, int n) {init(n);init(p, pm);}void COMinit(){for(auto p : pf){ll ps=p.first,pfs=pow(p.first,p.second);init(n_);init(ps,pfs);}}ll com(ll n, ll r,int p) {if (n<0 || r<0 || n<r) return 0;auto&[pms,ord,fac]=mp[p];ll e=ord[n]-ord[r]-ord[n-r];ll res=fac[n]*modinv(fac[r]*fac[n-r]%pms,pms)%pms;res=res*modpow(p,e,pms)%pms;return res;}ll operator()(int n, int k){if(n<0 || k<0 || n<k) return 0;int sz=pf.size();vector<long long> vb(sz), vm(sz);for (int i=0;i<sz;i++) {long long p = pf[i].first, e = pf[i].second;long long pm = pow(p,e);long long b = 1;b *= com(n, k ,p) % pm;b %= pm;vm[i]=pm;vb[i]=b;}auto res = ChineseRem(vb,vm);return res.first;}};template<int m> struct Perm{unordered_map<int,tuple<ll,vector<ll>,vector<ll>>> mp;int n_;ll p_, pm_;vector<ll> ord_, fact_;vector<P> pf;Perm(int n) : n_(n), ord_(n), fact_(n) {pf=prime_factorize(m);PERMinit();}void init(int n) {ord_.resize(n);fact_.resize(n);}void init(long long p, long long pm) {p_=p,pm_=pm;ord_[0]=ord_[1]=0;fact_[0]=fact_[1]=1;auto&[pms,ord,fac]=mp[p];pms=pm;ord.resize(n_);fac.resize(n_);ord[0]=ord[1]=0;fac[0]=fac[1]=1;for (int i=2;i<n_;i++) {long long add=0;long long ni=i;while (ni % p == 0) add++,ni/=p;ord_[i]=ord_[i-1]+add;fact_[i]=fact_[ni-1]*ni%pm;ord[i]=ord_[i];fac[i]=fact_[i];}}void init(long long p, long long pm, int n) {init(n);init(p, pm);}void PERMinit(){for(auto p : pf){ll ps=p.first,pfs=pow(p.first,p.second);init(n_);init(ps,pfs);}}ll perm(ll n, ll r,int p) {if (n<0 || r<0 || n<r) return 0;auto&[pms,ord,fac]=mp[p];ll e=ord[n]-ord[n-r];ll res=fac[n]*modinv(fac[n-r]%pms,pms)%pms;res=res*modpow(p,e,pms)%pms;return res;}ll operator()(int n, int k){if(n<0 || k<0 || n<k) return 0;vector<long long> vb, vm;for (auto ps : pf) {long long p = ps.first, e = ps.second;long long pm = pow(p,e);long long b = 1;b *= perm(n, k ,p) % pm;b %= pm;vm.push_back(pm);vb.push_back(b);}auto res = ChineseRem(vb,vm);return res.first;}};int main(){cout<<998244353<<endl;ll a,n;cin>>a>>n;cout<<modpow(a,n,998244353)<<endl;}