#include using namespace std; #define rep(i,a,b) for(ll i=a;i=b;i--) #define ll long long #define ull unsigned ll #define ld long double #define bl __int128_t #define fi first #define se second #define vel vector #define vvel vector #define pll pair #define vepll vector #define vvepll vector #define ves vector #define vem vector #define vvem vector #define pmm pair #define cleout(i) cout<using PQ=priority_queue,greater>; // 上 右 下 左 vector di={-1, 0, 1, 0}; vector dj={ 0, 1, 0,-1}; vector dx={ 0, 1, 0,-1}; vector dy={ 1, 0,-1, 0}; vector ddx={ 1, 1, 1, 0, -1, -1, -1, 0 }; vector ddy={ 1, 0, -1, -1, -1, 0, 1, 1 }; ll inf=1000000000000000000;//1e18 // LLONG_MAX mt19937_64 rng((ull)chrono::steady_clock::now().time_since_epoch().count()); //[x^M]1/(1-x)^N=comb(N-1+M,M) struct mint{ ll num; static ll P; static void set_mod(ll MOD){ P=MOD; } mint(ll x=0){ if(x<0){ x*=-1; x%=P; x=P-x; } x%=P; num=x; } mint operator+(const mint &other)const{ return mint(num+other.num); } mint operator-(const mint &other)const{ return mint(num-other.num); } mint operator*(const mint &other)const{ return mint(num*other.num); } mint &operator+=(const mint &other){ num+=other.num; if(num>=P) num-=P; return *this; } mint &operator-=(const mint &other){ num-=other.num; if(num<0) num+=P; return *this; } mint &operator*=(const mint &other){ num=(num*other.num)%P; return *this; } mint beki(const ll &x)const{ ll pos=x; mint res=1; mint now=num; while(pos){ if(pos&1){ res*=now; } now*=now; pos/=2; } return res; } mint inv()const{ mint res=1; mint now=num; rep(i,0,30){ if((P-2)&(1ll<>(istream& is,mint& m){ ll x; is>>x; m=mint(x); return is; } }; ll mint::P=998244353; //ll mint::P=1000000007; vvem dp(1.1e6,vem(11)); vel primes; vel minprime; vel make_mobius(ll N){ minprime.assign(N,N); vel mobius(N,0); mobius[1]=1; rep(i,2,N){ if(minprime[i]>i){ minprime[i]=i; primes.push_back(i); mobius[i]=-1; } for(ll p:primes){ if(p*i>=N)break; minprime[p*i]=p; if(minprime[i]==p){ mobius[p*i]=0; break; }else mobius[p*i]=-mobius[i]; } } return mobius; } /** * @brief 商列挙 * @details N/x の値が等しくなる区間 [l, r) とその商 val の組を列挙する * @param N 対象の整数 * @return vector, long long>> {{l, r}, val} */ vector> div_enumerate(ll N){ vector> res; for(ll l=1;l<=N;){ ll val=N/l; res.push_back({{l,N/val+1},val}); l=res.back().fi.se; } return res; } void _solve(){ ll N,M,K; cin>>N>>M>>K; mint ans=0; auto get=[&](ll l,ll r){ if(l>M)l=min(l,M); if(r>M)r=min(r,M); return dp[r][K]-dp[l][K]; }; for(auto [lr,x]:div_enumerate(M)){ mint pow=x; ans+=get(lr.fi-1,lr.se-1)*pow.beki(N); } cout<>_; else _=1; rep(__,0,_){ _solve(); } }