【ybt金牌导航8-4-4】【luogu P2155】互质个数 / 沙拉公主的困惑(gcd)(欧拉函数)

互质个数 / 沙拉公主的困惑

题目链接:ybt金牌导航8-4-4 / luogu P2155

题目大意

要你求 sum i=1~n![gcd(i,m!)=1]%r。
其中 r 是质数,n>=m。
很多组询问。

思路

重新写式子:
i=1n![gcd(i,m!)=1](modr)

我们不妨从 n>m 这个方面下手:
那首先 1m! 的部分肯定是 φ(m!)

那超出的部分呢?
我们再考虑一下会发现 m!|n!
然后再根据 gcd(a+b,b)=gcd(a,b) 这个东西。

你就会发现超出的部分就是不停的像 1m! 的部分循环下去,然后因为是 m!|n!,所以最后一次一定是循环完了的!
所以就是循环了 n!m! 次,那答案就是 n!m!φ(m!)

然后直接求好像不太行,因为它是很多组询问,所以我们考虑把 φ 用欧拉筛求的原理分解出来。
然后就是:n!m!φ(m!)=n!m!(m!pi1pi)=n!pi1pi
pim! 质因数分解中的每个质数,其实就相当于 1m 中的质数)

然后就可以直接搞了(用欧拉筛求质数的时候可以把 m 取每个值时的 pi1pi 算出来)
吗?

其实会有一个问题,就是 n,m 时可能 r 的。
那这个时候不一定是 0,因为可能 n! 会与 中的下面的 pi 消掉。
所以准确来说无解的情况时 nrm<r 或者 n2r(因为 下面至多只会出现一次)。

那如果 r 了但是答案不是 0,那我们计算的时候就直接把 r 的位置略过去。
(就是 n! 中和 中的下面部分,上面还是要留着 r1

然后就可以了。

代码

#include<cstdio> #define ll long long using namespace std; ll t, mo, n, m, jc[10000001], inv[10000001]; ll prime[1000001]; bool np[10000001]; ll ksm(ll x, ll y) { ll re = 1; while (y) { if (y & 1) re = re * x % mo; x = x * x % mo; y >>= 1; } return re; } int main() { scanf("%lld %lld", &t, &mo); jc[0] = 1; for (int i = 1; i <= 10000000; i++) if (i != mo) jc[i] = jc[i - 1] * i % mo; else jc[i] = jc[i - 1];//忽略掉 mo inv[0] = inv[1] = 1; for (int i = 2; i <= 10000000; i++) { if (!np[i]) { if (i != mo) inv[i] = inv[i - 1] * ksm(i, mo - 2) % mo * (i - 1) % mo; else inv[i] = inv[i - 1] * (i - 1) % mo;//下面忽略掉,上面还要 prime[++prime[0]] = i; } else inv[i] = inv[i - 1]; for (int j = 1; j <= prime[0] && i * prime[j] <= 10000000; j++) { np[i * prime[j]] = 1; if (i % prime[j] == 0) break; } } while (t--) { scanf("%d %d", &n, &m); if (n >= mo) { if (m < mo || n >= mo * 2) {//直接判无解情况 printf("0\n"); continue; } } printf("%lld\n", jc[n] * inv[m] % mo); } return 0; }

__EOF__

本文作者あおいSakura
本文链接https://www.cnblogs.com/Sakura-TJH/p/YBT_JPDH_8-4-4.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   あおいSakura  阅读(28)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示