HDU-5514-Frogs
2017-10-13 19:35
309 查看
ACM模版
Ps. 图片来源 ITAK’s blog。大佬的博客中也有这个题的容斥解法,很强很强很强。
描述
题解
可以用容斥解,也可以用欧拉函数解,推导过程真心强大。Ps. 图片来源 ITAK’s blog。大佬的博客中也有这个题的容斥解法,很强很强很强。
代码
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; const ll MAXN = 1e4 + 5; ll gcd(ll a, ll b) { if (b == 0) { return a; } return gcd(b, a % b); } int n; ll m; ll a[MAXN]; ll g[MAXN]; ll fac[MAXN]; ll Phi(ll x) { ll ans = x; for (ll i = 2; i * i <= x; i++) { if (x % i == 0) { ans -= ans / i; while (x % i == 0) { x /= i; } } } if (x > 1) { ans -= ans/x; } return ans; } int main() { int T; scanf("%d", &T); for (int ce = 1; ce <= T; ce++) { scanf("%d%lld", &n, &m); int flag = 0; for (int i = 0; i < n; i++) { scanf("%lld", a + i); g[i] = gcd(a[i], m); if (g[i] == 1) { flag = 1; } } printf("Case #%d: ", ce); if (flag == 1) { printf("%lld\n", m * (m - 1) >> 1); continue; } sort(g, g + n); n = (int)(unique(g, g + n) - g); int cnt = 0; for (ll i = 2; i * i <= m; i++) { if (i * i == m) { fac[cnt++] = m / i; } else if (m % i == 0) { fac[cnt++] = i; fac[cnt++] = m / i; } } sort(fac, fac + cnt); ll sum = 0; for (int i = 0; i < cnt; i++) { for (int j = 0; j < n; j++) { if (fac[i] % g[j] == 0) { sum += Phi(m / fac[i]) * m >> 1; break; } } } printf("%lld\n", sum); } return 0; }
相关文章推荐
- HDU 5514 Frogs(容斥原理)——2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
- HDU - 5514 Frogs (2015 ICPC沈阳 容斥)
- hdu 5514 Frogs 2015沈阳区域赛 数论 欧拉 好题 开心的题
- HDU 5514 Frogs(容斥)
- HDU - 5514 Frogs 容斥原理(贡献值实现)
- HDU 5514 Frogs(欧拉函数+数论YY)
- HDU 5514 Frogs(巧妙地容斥)
- HDU 5514 Frogs
- HDU 5514 (ACM 2015 沈阳) Frogs [容斥+记忆化搜索]
- HDU 5514 Frogs 容斥
- HDU 5514 Frogs(容斥原理 gcd)
- hdu 5514 -Frogs (容斥原理 )
- HDU 5514 Frogs (容斥原理)
- HDU - 5514 - Frogs 【完美使用欧拉函数 -> 也可容斥】
- HDU 5514 Frogs(容斥原理)
- hdu 5514 Frogs 容斥或欧拉函数
- HDU 5514 Frogs 容斥定理
- HDU 5514 Frogs
- HDU 5514 Frogs (2015沈阳F题&&容斥+剪枝)
- hdu 5514 Frogs 欧拉函数