HDU 6053(莫比乌斯反演)
题意略。
思路:首先想到暴力去扫,这样的复杂度是n * min(ai),对于gcd = p,对答案的贡献应该是 (a1 / p) * (a2 / p) * .... * (an / p),得出这个贡献未必要暴力地去扫,
我们可以分桶后,再求后缀和,再作差来得到个数后,进行快速幂。比如说:我们想知道gcd = p时对答案的贡献,那么add = (c1 ^ d1) * (c2 ^ d2) *.....,其中
c1是ai / p之后得出的数,d1表示(a1 / p) * (a2 / p) * .... * (an / p)中,有多少ai / p == c1,这样我们求出所有的ci所用时间是 log(n) ,对于每一个ci,要求出
ci ^ di所用时间也是log的。把每一个 <= min(ai)统计一次,所用时间是n * logn * logn。
注意,我们在枚举p的时候,只枚举由互不相同的因子组成的p,当p内含有相同因子时,它是前种情况的子集,这里肯定有重复,可以利用莫比乌斯反演来
去重。
详见代码:
#include<bits/stdc++.h>
#define maxn 100005
//#define LOCAL
using namespace std;
typedef long long LL;
const LL mod = 1e9 + ; bool check[maxn];
int prime[maxn],mu[maxn];
LL sum[maxn]; void mobius(){
memset(check,false,sizeof(check));
mu[] = ;
int tot = ;
for(int i = ;i < maxn;++i){
if(!check[i]){
prime[tot++] = i;
mu[i] = -;
}
for(int j = ;j < tot;++j){
if(i * prime[j] > maxn) break;
check[i * prime[j]] = true;
if(i % prime[j] == ){
mu[i * prime[j]] = ;
break;
}
else mu[i * prime[j]] = -mu[i];
}
}
}
LL quick_pow(LL a,LL n){
LL ret = ;
while(n > ){
if(n & ){
ret *= a;
ret %= mod;
}
n = n / ;
a = a * a % mod;
}
return ret;
} int main(){
#ifdef LOCAL
freopen("kkk.txt","r",stdin);
freopen("kkkout.txt","w",stdout);
#endif
int T,cas = ;
mobius();
scanf("%d",&T);
while(T--){
int minn = maxn,maxx = -maxn;
int n,temp;
scanf("%d",&n);
memset(sum,,sizeof(sum));
for(int i = ;i < n;++i){
scanf("%d",&temp);
++sum[temp];
minn = min(minn,temp);
maxx = max(maxx,temp);
}
for(int i = maxn - ;i >= ;--i)
sum[i] += sum[i + ];
LL ans = ;
for(int i = ;i <= minn;++i){
if(mu[i] == ) continue;
LL temp = -mu[i];
for(int j = i;j <= maxx;j += i){
temp = (temp * quick_pow(j / i,sum[j] - sum[min(maxx + ,j + i)]) % mod);
}
ans += temp;
ans = (ans % mod + mod) % mod;
}
printf("Case #%d: %lld\n",cas++,ans);
}
return ;
} /*
1
4
4 6 9 7
*/
HDU 6053(莫比乌斯反演)的更多相关文章
- HDU 4746 (莫比乌斯反演) Mophues
这道题看巨巨的题解看了好久,好久.. 本文转自hdu4746(莫比乌斯反演) 题意:给出n, m, p,求有多少对a, b满足gcd(a, b)的素因子个数<=p,(其中1<=a<= ...
- HDU 1695 (莫比乌斯反演) GCD
题意: 从区间[1, b]和[1, d]中分别选一个x, y,使得gcd(x, y) = k, 求满足条件的xy的对数(不区分xy的顺序) 分析: 虽然之前写过一个莫比乌斯反演的总结,可遇到这道题还是 ...
- GCD HDU - 1695 莫比乌斯反演入门
题目链接:https://cn.vjudge.net/problem/HDU-1695#author=541607120101 感觉讲的很好的一个博客:https://www.cnblogs.com/ ...
- HDU 5212 莫比乌斯反演
Code Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submis ...
- hdu 1695(莫比乌斯反演)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 4746Mophues[莫比乌斯反演]
Mophues Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327670/327670 K (Java/Others) Total ...
- 算术 HDU - 6715 (莫比乌斯反演)
大意: 给定$n,m$, 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^m\mu(lcm(i,j))$ 首先有$\mu(lcm(i,j))=\mu(i)\mu(j)\m ...
- HDU 4746 莫比乌斯反演+离线查询+树状数组
题目大意: 一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数 多次询问1<=x<=n,1<=y<=m,P ...
- HDU 5382 莫比乌斯反演
题目大意: 求S(n)的值 n<=1000000 这是官方题解给出的推导过程,orz,按这上面说的来写,就不难了 这里需要思考的就是G(n)这个如何利用积性函数的性质线性筛出来 作为一个质数,那 ...
随机推荐
- 2015.11.27---Java
public class star{ public static void main(String[] args) { System.out.print("ha"); } }
- springboot整合mybatis时无法读取xml文件解决方法(必读)
转 http://baijiahao.baidu.com/s?id=1588136004120071836&wfr=spider&for=pc 在springboot整合myba ...
- 第一篇博客 安装open live writer
第一篇博客安装open live writer http://openlivewriter.org/ 有的人可能会打不开,所以我准备了一个百度云的链接地址 链接:https://pan.baidu.c ...
- PHP与ECMAScript_7_流程控制
PHP ECMAScript 顺序结构 默认从上到下依次执行 默认从上到下依次执行 分支结构 if / switch if / switch 循环结构 for / while / do-w ...
- Java性能调优之让程序“飞”起来-Java 代码优化
代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final ...
- 前后端分离 之vue-cli 搭建项目mac 系统讲解
前端项目搭建必备技术 webpack nodejs 搭建 vue-cli 的安装 以上技术自行了解安装 一:创建前端项目 采用vue-cli 脚手架 1:终端执行如下命令 vue init webpa ...
- 通过mark和reset方法重复利用InputStream
InputStreammarkreset 在这篇博客中我们已经简单的知道可以通过缓存InputStream来重复利用一个InputStream,但是这种方式的缺点也是明显的,就是要缓存一整个Input ...
- Mac Android 配置环境变量
进入终端,输入以下命令: cd ~ touch .bash_profile //没有该文件的话新建一个 vi .bash_profile //vim 形式打开 输入内容jdk变量配置内容: expor ...
- 大数阶乘(c++实现)
#include <iostream>using namespace std;#define N 1000int BigNumFactorial(int Num[], int n);voi ...
- .net core 基于 IHostedService 实现定时任务
.net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...