hdu 6053 trick gcd 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=6053
题意:给定一个数组,我们定义一个新的数组b满足bi<ai 求满足gcd(b1,b2....bn)>=2的数组b的个数
题解:利用容斥定理。我们先定义一个集合f(x)表示gcd(b1,b2...bn)为x倍数的个数(x为质数),我们在定义一个数mi为数组中的最小值,那么集合{f(2)Uf(3)....f(n)}就是我们想要的答案。f(x)=(a1/x)*(a2/x)*.....(ai/x),直接累加肯定是有重复的,我们得用容斥定理筛一下,如果x是奇数个不同素数因子的乘积最后的结果要加上f(x);如果x为偶数个不同素数因子的乘积,最后的结果要减去f(x),其他情况贡献为0。是不是和莫比乌斯函数的情况正好相反?这里筛值的时候,用0(n)求到的莫比乌斯函数筛时间复杂度还是可以的。光这样还是不够,因为数组的长度为1e5,我们求f(x)的时候也得优化,怎么优化呢。我们把用一个权值数组把a[i]的值离散上去,为啥要用权值的形式存放a数组的值呢,我们把权值数组分成x段,每段的贡献由1开始递增到x(这段比较抽象,具体看下代码)
ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
const int mod=1e9+;
ll mu[];
int prime[],vis[];
ll a[],sum[];
// 比较大的数组还是定义在外面比较好
ll qpow(ll a,ll b)
{
ll f=;
while(b)
{
if(b%==) f=(f*a)%mod;
a=(a*a)%mod;
b/=;
}
return f;
} void init()
{
mu[]=;
memset(mu,,sizeof(mu));
memset(prime,,sizeof(prime));
memset(vis,,sizeof(vis));
int ret=;
for(int i=;i<;i++)
{
if(!vis[i])
{
prime[ret++]=i;
mu[i]=-1LL;
}
for(int j=; j<ret && i*prime[j] < ;j++)
{
int temp=i*prime[j];
vis[temp]=;
if(i%prime[j]) mu[temp]=-mu[i];
else
{
mu[temp]=;
break;
}
}
}
} int main()
{
int t;
scanf("%d",&t);
init(); int Case=;
while(t--)
{
ll n;
cin>>n;
ll mi=;
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
mi=min(a[i],mi);
sum[a[i]]++;
}
for(int i=;i<=;i++) sum[i]+=sum[i-];
ll zz=;
for(int i=;i<=mi;i++)
{
ll ans=;
if(mu[i]==) continue;
for(int j=;j*i<=;j++)// 平铺分段的思想 枚举贡献的思想吧,对于f(x)来说,x/n相同的值比较多,这样就可以把问题的规模变小 这个思维比较常见
{
ans=(ans*qpow(j,sum[i*(j+)-]-sum[j*i-])%mod)%mod;
}
zz=(zz-mu[i]*ans%mod+mod)%mod;// ! 取模的时候 如果有减法 要注意
}
printf("Case #%d: ",++Case);
cout<<zz<<endl;
}
return ;
}
hdu 6053 trick gcd 容斥的更多相关文章
- hdu 6053 TrickGCD(筛法+容斥)
		TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ... 
- HDU 1695 GCD 容斥
		GCD 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=1695 Description Given 5 integers: a, b, c, d, k ... 
- hdu 1695 GCD   容斥+欧拉函数
		题目链接 求 $ x\in[1, a] , y \in [1, b] $ 内 \(gcd(x, y) = k\)的(x, y)的对数. 问题等价于$ x\in[1, a/k] , y \in [1, ... 
- HDU 5656 CA Loves GCD (容斥)
		题意:给定一个数组,每次他会从中选出若干个(至少一个数),求出所有数的GCD然后放回去,为了使自己不会无聊,会把每种不同的选法都选一遍,想知道他得到的所有GCD的和是多少. 析:枚举gcd,然后求每个 ... 
- C - Visible Trees HDU - 2841 -莫比乌斯函数-容斥
		C - Visible Trees HDU - 2841 思路 :被挡住的那些点(x , y)肯定是 x 与 y不互质.能够由其他坐标的倍数表示,所以就转化成了求那些点 x,y互质 也就是在 1 - ... 
- 2017ACM暑期多校联合训练 - Team 2 1009    HDU    60563    TrickGCD   (容斥公式)
		题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ... 
- HDU 5297 Y sequence 容斥 迭代
		Y sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5297 Description Yellowstar likes integer ... 
- LightOJ 1161 - Extreme GCD  容斥
		题意:给你n个数[4,10000],问在其中任意选四个其GCD值为1的情况有几种. 思路:GCD为1的情况很简单 即各个数没有相同的质因数,所以求所有出现过的质因数次数再容斥一下-- 很可惜是错的,因 ... 
- HDU 4609 3-idiots FFT+容斥
		一点吐槽:我看网上很多分析,都是在分析这个题的时候,讲了半天的FFT,其实我感觉更多的把FFT当工具用就好了 分析:这个题如果数据小,统计两个相加为 x 的个数这一步骤(这个步骤其实就是求卷积啊),完 ... 
随机推荐
- vue不同序号的元素添加不同的样式
			vue不同序号的元素添加不同的样式 一.总结 一句话总结: 在vue中设计一个样式的数据数组来遍历即可 <script> new Vue({ el:'#review_exam_part', ... 
- mysql  给用户设置权限
			grant all on wordpress.* to wordpress@'10.0.0.%' identified by 'wordpress'; all 全部权限 ... 
- javascript-类型、值和变量
			基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ... 
- osg  help
			#ifdef _WIN32#include <Windows.h>#endif // _WIN32 #include <osgViewer/Viewer>#include &l ... 
- Spring Boot中报错org.apache.ibatis.binding.BindingException: Parameter 'XXXX' not found. Available parameters are [0, 1, param1, param2]的解决办法
			我这里的报错信息显示: org.apache.ibatis.binding.BindingException: Parameter 'reqUsername' not found. Available ... 
- maven-mybatis代码生成
			1.创建测试工程 选择maven Project 点击next 填写项目名称 点击 finish 项目创建完成 2.pom.xml <project xmlns="http://mav ... 
- Flutter之切换导航TabBar组件
			TabController 这是Tab页的控制器,用于定义Tab标签和内容页的坐标,还可配置标签页的切换动画效果等. TabController的创建有两种形式,一种是使用系统的DefaultTabC ... 
- mac 查看隐藏文件及快速打开终端
			查看隐藏文件: 1.在目标目录打开终端,然后输入ls -al命令快速查看目标目录下的文件(包括隐藏文件) 2.快捷键shift+cmmand+.(显示或者隐藏) 打开终端方式: 1.设置组合快捷键,单 ... 
- Docker Java程序镜像制作
			Docker Java程序镜像制作 制作前的准备 jre:不需要完整的jdk,jre即可,到Oracle进行下载即可,下载链接,根据自己的情况进行选择,这里选择jre-8u221-linux-x64. ... 
- Fabric 查看 blockfile_000000 区块文件
			进入peer docker exec -it peer bash cd /var/hyperledger/production/ledgersData/chains/chains 
