题解:P10580 [蓝桥杯 2024 国 A] gcd 与 lcm
P10580 题解
题面
前置知识
容斥原理
(1) 集合 S 中不具有性质 P1,P2,⋯,Pn 的对象个数为
|¯A1∩¯A2∩⋯∩¯An|=|S|−n∑i=1|Ai|+n∑i=1∑j>i|Ai∩Aj|−n∑i=1∑j>i∑k>j|Ai∩Aj∩Ak|+⋯+(−1)n−1|A1∩A2∩⋯∩An|
简记(我的方法):奇减偶加
(2) 集合 S 中至少具有性质 P1,P2,⋯,Pn 之一的对象个数为
|A1∪A2∪⋯∪An|=n∑i=1|Ai|−n∑i=1∑j>i|Ai∩Aj|+n∑i=1∑j>i∑k>j|Ai∩Aj∩Ak|+⋯+(−1)n−1|A1∩A2∩⋯∩An|
简记:奇加偶减
思路
首先,显然 a 肯定都是 x 的倍数,问题就是在 yx 上。
我们可以将 yx 质因数后一个个考虑,设 yx=∑i=1peii,对于每一个质数分开去考虑,最后把答案乘起来(乘法原理),不妨把最小公倍数是 x 和最大公倍数是 y 看做两个条件,然后去容斥。
对于一个质数 pi 我们有。
发现算最大公因数是 x,最小公倍数是 y 的方案数是比较困难的,所以我们不妨把题目转化为集合 S 中不具有性质 P1,P2 的对象个数有多少,其中:
- P1 为最大公约数不为 x。
- P2 为最小公倍数不为 y。
于是有。
- 没有 P1,P2 的限制,我们可以取到 [0,ei],所以 |S|=(ei+1)n 。
- 只有 P1 的限制,我们可以取到 [1,ei](取到 0 最大公因数就是 x 了),所以 |A1|=eni。
- 只有 P2 的限制,我们可以取到 [0,ei−1](取到 ei 最小公倍数就是 y 了),所以 |A2|=eni。
- 对于有 P1,P2 的限制,我们只能取到 [1,ei−1],所以 |A1∩A2|=(ei−1)n。
故,一个质数的方案数为 |S|−|A1|−|A2|+|A1∩A2|=(ei+1)n−2×eni+(ei−1)n。
最后把每个质数的方案数乘起来即可。
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
const int mod=998244353;
ll x,y,n,t,ans;
void write(ll n){if(n<0){putchar('-');write(-n);return;}if(n>9)write(n/10);putchar(n%10+'0');}
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
ll ksm(ll a, ll b){ll res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}return res;}
void solve(){
x=read();y=read();n=read();t=y/x;ans=1;
for(int i=2; i<=sqrt(t); i++) if(t%i==0){
ll num=0;
while(t%i==0) t/=i,num++;
ans=ans*((ksm(num+1,n)-(2*ksm(num,n)%mod)+ksm(num-1,n))%mod+mod)%mod;
}
if(t>1){ans=ans*((ksm(2,n)-2)%mod+mod)%mod;}
write(ans);putchar('\n');
}
int main(){
ll T=read();while(T--)solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!