CF1717E Madoka and The Best University 题解
思路来自 ,所以就不交洛谷题解了,但本着我竟然会推这个玩意的神奇,所以写一发。
这里是 大佬的题解,同步发表于洛谷。
看到 首先给拆出来枚举。
考虑化简 。
根据辗转相除法,有
那么代入到 中即为:
再将 除过去得到:
由于 所以直接把 给换成 。
即 时才对答案有贡献,于是发现这玩意就是个 。
此时整个柿子变为:
因为 ,即 是 的倍数,那么就可以枚举这个倍数 得到 ,解出来 ,于是就可以算了。
枚举倍数和求 都是 的,所以总时间复杂度 。
注意这个题 。我也不清楚为什么。。
code
#include <iostream>
#define GMY (520&1314)
#define char_phi signed
#define FBI_OPENTHEDOOR(x, y) freopen(#x ".in", "r", stdin), freopen(#y ".out", "w", stdout);
#define re register int
#define DMARK cerr << "###"
#define _ ' '
#define Endl cout << '\n'
#define Dl cerr << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 100005
#define P 1000000007
#define mod %
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL);}
/*
我竟然会了
*/
long long n, final_ans;
char nop[N];
long long prime[N], phi[N];
inline void Getphi(){
phi[1] = 0;
for (long long i = 2 ; i <= n ; ++ i){
if (nop[i] == false)
prime[++ prime[0]] = i, phi[i] = i-1;
for (long long j = 1 ; j <= prime[0] ; ++ j){
if (i * prime[j] > n)
break;
nop[i*prime[j]] = true;
if (i % prime[j] == 0)
phi[i*prime[j]] = phi[i] * prime[j];
else
phi[i*prime[j]] = phi[i] * (prime[j]-1);
}
}
}
long long gcd(long long x, long long y) {return ((y == 0) ? (x) : (gcd(y, x%y)));}
inline long long lcm(long long x, long long y) {return (x * y / gcd(x, y));}
inline void work(){
cin >> n;
Getphi();
for (long long d = 1, c ; d <= n ; ++ d){
// 枚举倍数
for (long long bs = 1 ; d*bs <= n ; ++ bs){
c = n - d * bs;
final_ans = (final_ans + lcm(c, d) * phi[bs] mod P) mod P;
}
}
cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
#ifdef IXINGMY
FBI_OPENTHEDOOR(a, a);
#endif
Fastio_setup();
work();
return GMY;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现