NC20667 数学题
题目
题目描述
最近,华东交通大学ACM训练基地的老阿姨被一个数学问题困扰了很久,她希望你能够帮她解决这个问题。
这个数学问题是这样的,给你一个N,要求你计算
gcd(a,b)表示a和b的最大公约数
输入描述
多组输入,每行一个整数n(1<=n<=10^14)。
输出描述
每行一个整数,表示答案。由于答案会很大你要对1000000007取模。
示例1
输入
4 10
输出
6 35
说明
样例一,2+4=6。
样例二,2+4+5+6+8+10=35。
题解
知识点:欧拉函数,GCD与LCM。
简单推一下式子:
第二行后面一项表示 中和 互质的数的和,可以用欧拉函数 得到。
简单证明一下:与 互质的数总是成对出现的 ,因此每一对的和都是 ,所以答案就是 乘以 。特别地, 时答案和公式一样, 时加一个简单修正即可。
另外,这个证明也可以看出来,与 互质的数总是偶数个。
其中欧拉函数每个需要单独求,即需要对 分解质因数。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; using ll = long long; using i128 = __int128_t; const int P = 1e9 + 7; ll euler_one(ll n) { ll ans = n; for (ll i = 2;i * i <= n;i++) { if (!(n % i)) { ans = ans / i * (i - 1); while (!(n % i)) n /= i; } } if (n > 1) ans = ans / n * (n - 1); return ans; } int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); ll n; while (cin >> n) cout << int(((i128)n * (n + 1) / 2 - ((i128)n * euler_one(n) + (n == 1)) / 2) % P) << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/17658269.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧