【ybt金牌导航8-4-7】【SSL 2639】【bzoj 4173】集合统计 / 简单的数学题 / 数学(结论)(欧拉函数)

集合统计 / 简单的数学题 / 数学

题目链接:ybt金牌导航8-4-7 / SSL 2639 / bzoj 4173

题目大意

给你 n,m 要你求 φ(n)φ(m)sum φ(ai)。
其中 ai 是满足 n%x+m%x>=x 的所有 x。

思路

重新写式子:
设集合 S(n,m) 为满足 n%k+m%kkk 组成的集合。

然后要你求:φ(n)φ(m)kS(n,m)φ(k)

其实你看样例啊什么都都可以猜出来,最右边这个是 nm

这里给一下证明:
knk+n%k=n
kmk+m%k=m
两个加起来:
knk+n%k+kmk+m%k=n+m
(knk+kmk)+(n%k+m%k)=n+m
然后根据 n%k+m%kk 代替进去:
k(nk+mk)+kn+m

然后显然 n%k+m%k2k,所以它除 k 向下取整是 1
那我们就全部除 k 向下取整,那它前面 就肯定是 = 了。
nk+mk+1=n+mk
n+mknkmk=1

然后我们带进去:
kS(n,m)φ(k)
k=1n+mφ(k)n+mkk=1nφ(k)nkk=1mφ(k)mk

这里我看了半天才知道为什么,就是因为你上面这个式子:n+mknkmk
它肯定是 0/1,那不符合的情况就是 0,那就无影响也可以加上,然后右边两个因为大了之后除向下取整的结果肯定是 0 所以可以都不要。

然后你考虑 i=1xφ(i)xi 怎么求。
i=1nφ(i)ni=j=1ni|jφ(i)=j=1nj

然后就成了:
k=1n+mkk=1nkk=1mk

然后三个等差序列和你化简一下就成了 nm

代码

#include<cstdio> #define ll long long #define mo 998244353 using namespace std; ll n, m, pr[4000001]; ll ans; bool np[40000001]; ll phi(ll now) { ll re = 1; for (int i = 1; i <= pr[0] && pr[i] * pr[i] <= now; i++) { if (now % pr[i] == 0) { re = re * (pr[i] - 1) % mo; now /= pr[i]; while (now % pr[i] == 0) { re = re * pr[i] % mo; now /= pr[i]; } } } if (now > 1) { re = re * (now - 1) % mo; } return re; } int main() { for (int i = 2; i <= 4e7; i++) { if (!np[i]) pr[++pr[0]] = i; for (int j = 1; j <= pr[0] && i * pr[j] <= 4e7; j++) { np[i * pr[j]] = 1; if (i % pr[j] == 0) break; } } scanf("%lld %lld", &n, &m); ans = (n % mo) * (m % mo) % mo;//直接上结论 printf("%lld", ans * phi(n) % mo * phi(m) % mo); return 0; }

__EOF__

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