#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; using namespace atcoder; typedef long long ll; typedef pair P; using mint=modint998244353; const int MAX=1000000; bitset isprime; void sieve(){ for(int i=3; i divs, pc; inline ll idx(ll x){ return (x<=sq)?x-1:(ll)divs.size()-n/x; } void calc(){ sieve(); while((sq+1)*(sq+1)<=n) sq++; for(int i=1; i<=sq; i++) divs.push_back(i); for(int i=sq; i>=1; i--) if(n/i>sq) divs.push_back(n/i); int k=0; isq=-1; for(int i=2; isq && isq==-1) isq=k; k++; } } } void primecount(){ vector dp=divs; pc.resize(divs.size(), -1); int l; for(l=0; l=l; j--){ int k=idx(divs[j]/p[i-1]); if(pc[k]!=-1) dp[j]-=pc[k]-i+2; else dp[j]-=dp[k]; } for(int j=l; j solve(){ vector dp(divs.size()); for(int i=isq-1; i>=0; i--){ int l=lower_bound(divs.begin(), divs.end(), p[i]*p[i])-divs.begin(); for(int j=(int)divs.size()-1; j>=l; j--){ mint a=dp[j]; if(p[i+1]*p[i+1]>divs[j]){ //assert(pc[j]>=i+1); a=1+mint(pc[j]-i-1)*c[1]; } ll x=divs[j]/p[i]; int e=1; while(x){ int k=idx(x); mint b=dp[k]; if(xdivs[k]){ //assert(pc[k]>=i+1); b=1+mint(pc[k]-i-1)*c[1]; } a+=b*c[e]; x/=p[i]; e++; } dp[j]=a; } } for(int i=0; i>len>>n; for(int i=1; i<40; i++){ c[i]=mint(i+1).pow(len)-mint(i).pow(len); } calc(); primecount(); auto dp=solve(); // for(auto x:divs){ // cout<