题目链接

定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数

(可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html hdu1695 进行类比)

显然F[n]和f[n]是满足下面这个关系的

所以,可以用下面这个公式求解f[n]

  

得到下面的AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; #define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b)) const int maxn=1e5+;
int prime[maxn+];
bool check[maxn+];
int mu[maxn+]; void init()
{
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];
}
}
}
} const int N=1e5+;
const int mod=1e9+; int n;
int num[*N];
LL F[N];
LL f[N]; LL qpow(LL x,LL n)
{
LL ret=;
for(;n;n>>=)
{
if(n&) ret=ret*x%mod;
x=x*x%mod;
}
return ret;
} int main()
{
init();
int T;
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
memset(num,,sizeof(num));
memset(f,,sizeof(f));
int max_gcd=1e9,max_a=;
LL ans=;
scanf("%d",&n);
for(int i=;i<n;i++)
{
int t;
scanf("%d",&t);
num[t]++;
max_gcd=min(t,max_gcd);
max_a =max(t,max_a );
}
for(int i=;i<*N;i++)
num[i]+=num[i-];
for(int i=;i<=max_gcd;i++)
{
F[i]=;
for(int j=i;j<=max_a;j+=i)
F[i]=F[i]*qpow(j/i,num[j+i-]-num[j-])%mod;
}
// =================================
for(int i=;i<=max_gcd;i++)
for(int j=;i*j<=max_gcd;j++)
f[i]=(f[i]+mu[j]*F[i*j])%mod;
for(int i=;i<=max_gcd;i++)
ans=(ans+f[i])%mod;
// =================================
printf("Case #%d: %lld\n",kase,ans);
}
}

然而!=====所夹的部分可以用一行代码代替!!!!虽然运行时间不会减少多少,不过代码量上优化了很多!

不过这种写法的实质其实可以从容斥原理的角度来考虑,再借用了莫比乌斯函数的性质。

定义:  性质Pi表示i是对象x的一个质因数,  集合Ai表示具有性质Pi的对象的集合

比较容易想到,所有可能的公因数对应的对象计数之和,恰为所有集合的并 中的对象的总个数

那么用容斥原理求 所有集合的并 中的对象的总个数时,奇数个基本集合的交前面的系数是正一,偶数个的是负一。并且,n的因数中包含质因数平方的F[n]在这里面是不需要被计数的。

这样恰好就与莫比乌斯函数的性质产生了联系。

参考博客:  http://blog.csdn.net/acterminate/article/details/76216345

也就变成了

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; #define max(a,b) ((a)>(b)? (a):(b))
#define min(a,b) ((a)<(b)? (a):(b)) const int maxn=1e5+;
int prime[maxn+];
bool check[maxn+];
int mu[maxn+]; void init()
{
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];
}
}
}
} const int N=1e5+;
const int mod=1e9+; int n;
int num[*N];
LL F[N];
LL f[N]; LL qpow(LL x,LL n)
{
LL ret=;
for(;n;n>>=)
{
if(n&) ret=ret*x%mod;
x=x*x%mod;
}
return ret;
} int main()
{
init();
int T;
scanf("%d",&T);
for(int kase=;kase<=T;kase++)
{
memset(num,,sizeof(num));
memset(f,,sizeof(f));
int max_gcd=1e9,max_a=;
LL ans=;
scanf("%d",&n);
for(int i=;i<n;i++)
{
int t;
scanf("%d",&t);
num[t]++;
max_gcd=min(t,max_gcd);
max_a =max(t,max_a );
}
for(int i=;i<*N;i++)
num[i]+=num[i-];
for(int i=;i<=max_gcd;i++)
{
F[i]=;
for(int j=i;j<=max_a;j+=i)
F[i]=F[i]*qpow(j/i,num[j+i-]-num[j-])%mod;
// printf("F[%d]=%4lld\n",i,F[i]);
ans=(ans-mu[i]*F[i]+mod)%mod;
}
printf("Case #%d: %lld\n",kase,ans);
}
}

hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】的更多相关文章

  1. HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2

    /* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...

  2. hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】

    题目链接 有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形. 然后根据这个结论来做. 我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[ ...

  3. hdu 6045: Is Derek lying? (2017 多校第二场 1001)【找规律】

    题目链接 可以暴力找一下规律 比如,假设N=7,两人有5题相同,2题不同,枚举X=0->15时,Y的"Not lying"的取值范围从而找出规律 #include<bi ...

  4. hdu 6047: Maximum Sequence (2017 多校第二场 1003)【贪心】

    题目链接 可以贪心写,先把b数组按从小到大的顺序排个序,根据b[i]的值来产生a[n+i] 借助一个c数组,c[i]记录,j从i到n,a[j]-j的最大值,再加上一个实时更新的变量ma,记录从n+1到 ...

  5. hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】

    题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...

  6. hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语

    题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...

  7. hdu 5301 Buildings (2015多校第二场第2题) 简单模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...

  8. HDU 6053 TrickGCD —— 2017 Multi-University Training 2

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. 【HDU 5305】Friends 多校第二场(双向DFS)

    依据题意的话最多32条边,直接暴力的话 2 ^ 32肯定超时了.我们能够分两次搜索时间复杂度降低为 2 * 2  ^ 16 唯一须要注意的就是对眼下状态的哈希处理. 我採用的是 十进制表示法 跑的还是 ...

随机推荐

  1. CSS - 视觉格式化模型(Visual formatting model)

    几个概念 块:block,一个抽象的概念,块与块之间在垂直方向上按照顺序依次堆叠. 行内:inline,一个抽象的概念,行内与行内之间在水平方向上按照顺序依次堆叠(会有换行). 元素:element, ...

  2. python上下文管理,with语句

    今天在网上看到一段代码,其中使用了with seam:初见不解其意,遂查询资料. 代码: #! /usr/bin/env python # -*- coding:utf-8 -*- import ti ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_5_HashSet存储自定义类型元素

    想存储的元素不重复,就必须重写hashCode和equals这两个方法 新建一个Person类.添加姓名和年龄这两个成员变量..get和set,有参和无参构造. 重点是重写了toString的方法 自 ...

  4. KETTLE——(一)资源库

    对KETTLE有了大概的了解,pdi-ce-6.0.1.0-386也下载完成了. 1.解压pdi-ce-6.0.1.0-386.zip文件,双击运行Spoon.bat(KETTLE是Java开发的,运 ...

  5. 在centos7.4 nginx mysql php部署 thinkphp5.0 项目

    系统 centos7  环境 php 7.1.3 nignx 1.12.2 mysql 5.5.6 我是通过lnmp 集成环境安装 fastcgi.conf 末尾添加 vim fastcig.conf ...

  6. 如何快速查找到多个字典中的公共键(Key)---Python数据结构与算法相关问题与解决技巧

    如何快速查找到多个字典中的公共键(Key)-?   实际案例: 西班牙足球甲级联赛,每轮球员进球统计: 第1轮: { '苏亚雷斯':1,'梅西':2,'本泽马':1,...} 第2轮: { '苏亚雷斯 ...

  7. Android安全测试(三)应用完整性检验检测

    二.app应用完整性1.测试环境 SDK: Java JDK, Android SDK. 工具: 7zip,apktool.jar,signapk.jar 2.操作步骤 第一步:把需要检测的apk放置 ...

  8. TensorFlow学习笔记8-深度学习的正则化

    深度学习的正则化 回顾一些基本概念 概念 描述 设计矩阵 数据集在特征向量上的表示 训练误差 学习到的模型与训练集标签之间的误差 泛化误差(测试误差) 学习到的模型与测试集之间的误差 欠拟合 模型的训 ...

  9. openstack 制作镜像以及windows向Linux中通过xshell传文件

    慢慢的也要把openstack一些相关的笔记整理上来了 之前由于主要是在看horizon 实验室搭建的openstack平台并没有怎么实际的用起来,前几天别的同学要用来测试大数据的相关服务,才把这些内 ...

  10. Idea maven远程调试(pom配置tomcat)

    服务器端,maven内置tomcat启动命令:mvnDebug clean tomcat7:run -Dmaven.test.skip=true 服务器端:配置(vim或者文件模式打开mvnDebug ...