Mila
在走到古代迷宫出口时,发现一扇巨大的石门挡住了去路。
正当 Mila
兴致勃勃地想要来一发法术轰开这扇门时,团员一号提醒她,轰一下山就塌了,咱们会被埋住的……
于是 Mila
只好来解决石门上的谜题了,谜题是这样的,你需要求出下面这个式子的值:
∑ x 1 ∣ n ∑ x 2 ∣ n ⋯ ∑ x m ∣ n lcm ( x 1 , x 2 , … , x m ) \sum_{x_1 \mid n} \sum_{x_2 \mid n} \dots \sum_{x_m \mid n} \operatorname{lcm}(x_1,x_2,\dots,x_m) x1∣n∑x2∣n∑⋯xm∣n∑lcm(x1,x2,…,xm)
由于 Mila
数学不太好,所以这个问题就交给你了。
多组数据,第一行一个整数 T T T,表示数据组数。
下面 T T T 行每行两个整数 n , m n,m n,m,意义如上所述。
输出 T T T 行,表示答案对 998244353 998244353 998244353 取模后的值。
样例输入 1
1
4 2
样例输出 1
27
样例解释 1
lcm ( 1 , 1 ) + lcm ( 1 , 2 ) + lcm ( 1 , 4 ) + lcm ( 2 , 1 ) + lcm ( 2 , 2 ) + lcm ( 2 , 4 ) + lcm ( 4 , 1 ) + lcm ( 4 , 2 ) + lcm ( 4 , 4 ) = 1 + 2 + 4 + 2 + 2 + 4 + 4 + 4 + 4 = 27 \operatorname{lcm}(1,1)+\operatorname{lcm}(1,2)+\operatorname{lcm}(1,4)+\operatorname{lcm}(2,1)+\operatorname{lcm}(2,2)+\operatorname{lcm}(2,4)+\operatorname{lcm}(4,1)+\operatorname{lcm}(4,2)+\operatorname{lcm}(4,4)=1+2+4+2+2+4+4+4+4=27 lcm(1,1)+lcm(1,2)+lcm(1,4)+lcm(2,1)+lcm(2,2)+lcm(2,4)+lcm(4,1)+lcm(4,2)+lcm(4,4)=1+2+4+2+2+4+4+4+4=27
样例 2,3
见下发文件 question/question*.in
与 question/question*.ans
。
样例 2 满足 m ≤ 10 m\leq 10 m≤10。
样例 3 满足 n = 2 n=2 n=2。
对于前 20 % 20\% 20% 的数据,满足 n ≤ 10 , m ≤ 8 n\leq 10,m\leq 8 n≤10,m≤8。
对于前 40 % 40\% 40% 的数据,满足 m ≤ 10 m\leq 10 m≤10。
对于另外 20 % 20\% 20% 的数据,满足 n = 2 n= 2 n=2。
对于 100 % 100\% 100% 的数据,满足 1 ≤ T ≤ 100 , 1 ≤ n ≤ 1 0 12 , 1 ≤ m ≤ 1 0 18 1\leq T \leq 100,1\leq n \leq 10^{12},1\leq m\leq 10^{18} 1≤T≤100,1≤n≤1012,1≤m≤1018。
不难,但想岔了。。
直接枚举质因数,让
m
m
m个数随便乱选当前质因数,容斥计算方案。。
#include<bits/stdc++.h>
#define N 20005
typedef long long ll;
using namespace std;
const ll mod=998244353;
inline ll read(){
ll x=0;char s=getchar();
while(s<'0'||s>'9')s=getchar();
while(s>='0'&&s<='9'){x=(x<<3)+(x<<1)+s-'0';s=getchar();}
return x;
}
inline ll power(ll x,ll c){
ll now=1;
c%=(mod-1);
while(c){
if(c&1)now=1ll*now*x%mod;
x=1ll*x*x%mod;c>>=1;
}
return now;
}
ll qp[N],pri[N],cnt[N],tot,c[N],ans,C[N];
void dfs(int x){
if(x>tot){
ll sum=1,num=1;
for(int i=1;i<=tot;++i){
sum=sum*C[i]%mod;
num=num*(qp[c[i]+1]-qp[c[i]])%mod;
}
ans=(ans+sum*num%mod)%mod;
return ;
}
for(int i=0;i<=cnt[x];++i){
c[x]=i;C[x]=power(pri[x],c[x]);
dfs(x+1);
}
}
int main(){
ll T=read();
while(T--){
ll n=read(),m=read();
tot=0;
for(ll i=2;i<=sqrt(n);++i){
if(n%i==0)pri[++tot]=i,cnt[tot]=0;
while(n%i==0)n/=i,cnt[tot]++;
}
if(n!=1)pri[++tot]=n,cnt[tot]=1;
for(int i=1;i<=100;++i)qp[i]=power(i,m);
ans=0;
dfs(1);
printf("%lld\n",(ans+mod)%mod);
}
}
/*
1
2 3
*/