樱花
樱花
给定一个整数 ,求有多少正整数数对 满足 。
输入格式
一个整数 。
输出格式
一个整数,表示满足条件的数对数量。
答案对 取模。
数据范围
输入样例:
2
输出样例:
3
样例解释
共有三个数对 满足条件,分别是 ,,。
解题思路
可以发现有两个自变量,因此可以通过枚举来固定然后通过与的关系来得到满足条件的。其中关于的函数为。
现在问题就变成了有多少个正整数使得是一个正整数。由于分子分母同时含有不方便处理,因此把分子的去掉。
由于必然是一个正整数,因此问题又变成了有多少个正整数使得是一个正整数。一定正整数,但分母的不一定是正整数,事实上根据得到,由于和均要满足正整数的条件,因此必然要满足,因此。因此问题就等价于有多少个正整数使得是的约数,等价于就是问的约数个数。其中如果一个数,那么约数的个数为。
AC代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N = 1e6 + 10, mod = 1e9 + 7; 5 6 int primes[N], cnt; 7 bool vis[N]; 8 9 void get_prime(int n) { 10 for (int i = 2; i <= n; i++) { 11 if (!vis[i]) primes[cnt++] = i; 12 for (int j = 0; primes[j] <= n / i; j++) { 13 vis[primes[j] * i] = true; 14 if (i % primes[j] == 0) break; 15 } 16 } 17 } 18 19 int main() { 20 int n; 21 scanf("%d", &n); 22 get_prime(n); 23 int ret = 1; 24 for (int i = 0; i < cnt; i++) { 25 int p = primes[i], s = 0; 26 for (int j = n; j; j /= p) { 27 s += j / p; 28 } 29 ret = ret * (2ll * s + 1) % mod; 30 } 31 printf("%d", ret); 32 33 return 0; 34 }
参考资料
AcWing 1294. 樱花(算法提高课):https://www.acwing.com/video/691/
本文来自博客园,作者:onlyblues,转载请注明原文链接:https://www.cnblogs.com/onlyblues/p/17063618.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效