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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
| #include<bits/stdc++.h> using namespace std; #define int long long inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'|| ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;} #define Z(x) (x)*(x) #define pb push_back
#define N 2000010
#define mo 998244353 int pw(int a, int b) { int ans=1; while(b) { if(b&1) ans*=a; a*=a; b>>=1; ans%=mo; a%=mo; } return ans; } int pw(int a, int b, int p) { int ans=1; while(b) { if(b&1) ans*=a; a*=a; b>>=1; ans%=p; a%=p; } return ans; } int fac[N], inv[N], ifac[N]; void init(int n) { int i; for(i=fac[0]=1; i<=n; ++i) fac[i]=fac[i-1]*i%mo; ifac[n]=pw(fac[n], mo-2); for(i=n-1; i>=0; --i) ifac[i]=ifac[i+1]*(i+1)%mo; for(i=1; i<=n; ++i) inv[i]=ifac[i]*fac[i-1]%mo; } int C(int n, int m) { if(m>n) return 0; return fac[n]*ifac[m]%mo*ifac[n-m]%mo; } void Add(int &a, int b) { a+=b; if(a>=mo || a<=-mo) a%=mo; if(a<0) a+=mo; } void Mul(int &a, int b) { a*=b; if(a>=mo || a<=-mo) a%=mo; if(a<0) a+=mo; } void Mod(int &a) { if(a>=mo || a<=-mo) a%=mo; if(a<0) a+=mo; } void Mod(int &a, int p) { if(a>=p || a<=-p) a%=p; if(a<0) a+=p; } void Add(int &a, int b, int p) { a+=b; if(a>=p || a<=-p) a%=p; if(a<0) a+=p; } const int iv2=pw(2, mo-2); int b[N]; vector<int>z; void prim(int n) { memset(b, -1, sizeof(b)); b[1]=0; for(int i=2; i<=n; ++i) { if(b[i]) z.pb(i); for(int j : z) { if(i*j>n) break; b[j*i]=0; if(i%j==0) break; } } } int n, m, i, j, k, T; int ans, lim, lstlim, d, D, g[N], f[N], c, p, P; int S[N], s[N];
signed main() {
freopen("number.in", "r", stdin); freopen("number.out", "w", stdout);
n=read(); m=read(); init(2000000); prim(2000000); lstlim=0; ans=1; for(d=m; d>=1; --d) { lim=m/d;
f[d]=pw(d, pw(lim, n, mo-1)); for(auto p : z) { if(p>lim) break;
for(c=0, P=1; P<=lim; P*=p, ++c) { S[c]=pw(lim-lim/(P*p), n, mo-1);
} for(c=1, P=p; P<=lim; P*=p, ++c) { s[c]=S[c]-S[c-1]; Mod(s[c], mo-1);
Mul(f[d], pw(P, s[c]));
} } g[d]=f[d]; for(D=2*d; D<=m; D+=d) Mul(g[d], pw(g[D], mo-2));
Mul(ans, pw(g[d], d)); } Mod(ans); printf("%lld", ans); return 0; }
|