首页 > 代码库 > bzoj2705 [SDOI2012]Longge的问题
bzoj2705 [SDOI2012]Longge的问题
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2705
令s(k)为gcd(i, n) = k的i的个数,则ans = k * s(k).
若gcd(i, n) = k,则gcd(i / k, n / k) = 1,所以 s(k) = phi(n / k)。 (如果这里没搞懂,随便举个例子就懂了)
剩下的就是O(√n)枚举n的因数就好了~
#include <cstdio> #include <cmath> long long n, ans; int lmt; int phi(int x) { int rt = x; for (int i = 2; i * i <= x; ++i) { if (x % i == 0) { rt = rt / i * (i - 1); x /= i; while (x % i == 0) { x /= i; } } } if (x > 1) { rt = rt / x * (x - 1); } return rt; } int main(void) { scanf("%lld", &n); lmt = (int)sqrt((float)n + 0.5f); for (int i = 1; i <= lmt; ++i) { if (n % i == 0) { ans += (long long)i * (long long)phi(n / i); if (n / i != i) { ans += (long long)(n / i) * (long long)phi(i); } } } printf("%lld\n", ans); return 0; }
bzoj2705 [SDOI2012]Longge的问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。