DTOJ#5141. Mila 的谜题

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) x1nx2nxmnlcm(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*.inquestion/question*.ans

样例 2 满足 m ≤ 10 m\leq 10 m10

样例 3 满足 n = 2 n=2 n=2

对于前 20 % 20\% 20% 的数据,满足 n ≤ 10 , m ≤ 8 n\leq 10,m\leq 8 n10,m8

对于前 40 % 40\% 40% 的数据,满足 m ≤ 10 m\leq 10 m10

对于另外 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} 1T100,1n1012,1m1018

不难,但想岔了。。
直接枚举质因数,让 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
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值