hdu 6053 TrickGCD
来源:互联网 发布:xplay6知乎 编辑:程序博客网 时间:2024/05/29 21:18
Problem
acm.hdu.edu.cn/showproblem.php?pid=6053
莫比乌斯反演介绍
莫比乌斯反演(by PoPoQQQ)
莫比乌斯反演入门
莫比乌斯反演
Reference
2017 Multi-University Training Contest 2 solutions BY 电子科技大学(1009题)
HDU 6053 TrickGCD (莫比乌斯函数)
解题报告:HDU_6053 TrickGCD 莫比乌斯反演
Meaning
给定一个序列
1≤Bi≤Ai gcd(B1,…,Bn)≥2
问构造的方案数。
Analysis
暴力的做法,就是枚举 gcd,每一个 gcd 产生的答案是
…好吧其实现在并不太懂莫比乌斯反演…按官方题解,定义: F(x):gcd 是 x 倍数的方案数
;
我猜相应的就有: f(x):gcd 是 x 的方案数
;
于是:
而
按 dalao 的说法,因为枚举 gcd 时是从 2 开始的,f(1) 没有用到,所以在乘
在处理那个连乘式的时候,要用一点优化处理。
好吧还是很迷…
Code
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100000, A = N, MOD = 1000000007;int a[N], sum[N<<1|1];int prime[A+1];int mu[A+1];void Mobius(){ mu[1] = 1; memset(prime, -1, sizeof prime); for(int i = 2, top = 0; i <= A; ++i) { if(prime[i]) { prime[top++] = i; mu[i] = -1; } for(int j = 0; j < top && i * prime[j] <= A; ++j) { prime[i * prime[j]] = 0; if(i % prime[j]) mu[i * prime[j]] = -mu[i]; else { mu[i * prime[j]] = 0; break; } } }}int fast_pow(long long a, int b){ long long x = 1; for( ; b; b >>= 1, a = a * a % MOD) if(b & 1) x = x * a % MOD; return x % MOD;}int main(){ Mobius(); int T; scanf("%d", &T); for(int kase = 1; kase <= T; ++kase) { int n, small = A, big = 0; scanf("%d", &n); memset(sum, 0, sizeof sum); for(int i = 0; i < n; ++i) { scanf("%d", a+i); ++sum[a[i]]; small = min(small, a[i]); big = max(big, a[i]); } for(int i = 1; i <= big << 1; ++i) sum[i] += sum[i-1]; long long ans = 0, tmp; for(int d = 2; d <= small; ++d) if(tmp = -mu[d]) // mu[d] != 0 { for(int i = d; i <= big; i += d) tmp = tmp * fast_pow(i/d, sum[i+d-1]-sum[i-1]) % MOD; ans = (ans + tmp + MOD) % MOD; } printf("Case #%d: %I64d\n", kase, ans); } return 0;}
阅读全文
1 0
- HDU 6053 TrickGCD
- HDU 6053 TrickGCD
- HDU-6053 TrickGCD
- hdu 6053 TrickGCD
- HDU 6053 TrickGCD
- [HDU]6053 TrickGCD
- HDU 6053 TrickGCD 数论
- hdu--6053--TrickGCD
- hdu-6053TrickGCD
- HDU 6053 TrickGCD
- HDU 6053 TrickGCD
- HDU 6053 TrickGCD DP(筛法)
- HDU 6053 TrickGCD(枚举)
- TrickGCD HDU
- TrickGCD HDU
- hdu 6053 TrickGCD(筛法+容斥)
- hdu 多校 TrickGCD
- HDU 6503 TrickGCD
- python virtualenv 强制修改环境变量迁移环境
- logistics回归--梯度上升算法以及改进--用于二分类
- 《代码整洁之道》读书笔记
- if __name__ == '__main__'的作用与原理
- 深入理解java虚拟机学习笔记-4.java类加载机制
- hdu 6053 TrickGCD
- HDU 2612 Find a way
- C 非标准库(conio.h)
- bootstrap按钮和折叠插件
- 安卓开发debug-app卸载不干净,导致安装、升级不成功问题的解决办法
- k&R scanf 函数
- [LeetCode]121. Best Time to Buy and Sell Stock
- 动态稀疏矩阵对应的三元组的输出,以及逆置和赋值算法
- VS 安装助手,弹出“The security key for this program currently stored on your system does not appear to be ”