题解:P10580 [蓝桥杯 2024 国 A] gcd 与 lcm

P10580 题解

题面

原题传送门

前置知识

容斥原理

(1) 集合 S 中不具有性质 P1,P2,,Pn 的对象个数为

|¯A1¯A2¯An|=|S|ni=1|Ai|+ni=1j>i|AiAj|ni=1j>ik>j|AiAjAk|++(1)n1|A1A2An|

简记(我的方法):奇减偶加

(2) 集合 S 中至少具有性质 P1,P2,,Pn 之一的对象个数为

|A1A2An|=ni=1|Ai|ni=1j>i|AiAj|+ni=1j>ik>j|AiAjAk|++(1)n1|A1A2An|

简记:奇加偶减

思路

首先,显然 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,ei1](取到 ei 最小公倍数就是 y 了),所以 |A2|=eni
  • 对于有 P1,P2 的限制,我们只能取到 [1,ei1],所以 |A1A2|=(ei1)n

故,一个质数的方案数为 |S||A1||A2|+|A1A2|=(ei+1)n2×eni+(ei1)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;
}
posted @   naroto2022  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
战斗是残酷的,无法做出多余的考虑!