#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; bool rcmp(int a, int b) { return a>b; } typedef long long LL; map rs; int cpp[128]; int pp[128000]; char pmk[1024]; void build(int n, int p, int c) { if (n==0) { rs[p]+=c; return; } n--; build(n, p, c); build(n, p*cpp[n], c); } int gc=0; int gps[200004], gk, gm; int bb[200004]; int cs[200004]; #define MOD 998244353 void dfs(int n, int p, int c) { if (p>gm) return; // printf("dfs %d %d %d==>%d\n", n, p, c, rs[p]); if (n==0) { int x = bb[rs[p]]-1; if (x<0) x+=MOD; if (c&1) { gc-=x; if (gc<0) gc+=MOD; } else { gc+=x; if (gc>=MOD) gc-=MOD; } return; } n--; dfs(n, p, c); dfs(n, p*gps[n], c+1); } int main() { int n, i, c, j, p, k, v; int m, kk, vv; memset(pmk, 0, sizeof(pmk)); c=0; for (i=2; i ps; scanf("%d %d", &n, &m); for (i=0; i<=m; i++) cs[i]=0; bb[0]=1; for (i=1; i<=n; i++) bb[i]=(bb[i-1]*2)%MOD; for (i=0; ivv) break; if (vv%p) continue; while((vv%p)==0) vv/=p; cpp[kk++]=p; ps.insert(p); } if (vv>1) { cpp[kk++]=vv; ps.insert(vv); } build(kk, 1, cs[j]); } gc=0; k=0; for (auto x: ps) gps[k++]=x; gm=m/i; dfs(k, 1, 0); printf("%d\n", gc); } return 0; }