hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】
定义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) 【莫比乌斯 容斥原理】的更多相关文章
- HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2
/* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...
- hdu 6055 : Regular polygon (2017 多校第二场 1011) 【计算几何】
题目链接 有个结论: 平面坐标系上,坐标为整数的情况下,n个点组成正n边形时,只可能组成正方形. 然后根据这个结论来做. 我是先把所有点按照 x为第一关键字,y为第二关键字 排序,然后枚举向量 (p[ ...
- hdu 6045: Is Derek lying? (2017 多校第二场 1001)【找规律】
题目链接 可以暴力找一下规律 比如,假设N=7,两人有5题相同,2题不同,枚举X=0->15时,Y的"Not lying"的取值范围从而找出规律 #include<bi ...
- hdu 6047: Maximum Sequence (2017 多校第二场 1003)【贪心】
题目链接 可以贪心写,先把b数组按从小到大的顺序排个序,根据b[i]的值来产生a[n+i] 借助一个c数组,c[i]记录,j从i到n,a[j]-j的最大值,再加上一个实时更新的变量ma,记录从n+1到 ...
- hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】
题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...
- hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语
题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...
- hdu 5301 Buildings (2015多校第二场第2题) 简单模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...
- HDU 6053 TrickGCD —— 2017 Multi-University Training 2
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 【HDU 5305】Friends 多校第二场(双向DFS)
依据题意的话最多32条边,直接暴力的话 2 ^ 32肯定超时了.我们能够分两次搜索时间复杂度降低为 2 * 2 ^ 16 唯一须要注意的就是对眼下状态的哈希处理. 我採用的是 十进制表示法 跑的还是 ...
随机推荐
- Django的media配置与富文本编辑器使用的实例
效果预览 文章列表 添加文章 编辑文章|文章详情|删除文章 项目的基本文件 项目的Model from django.db import models # 导入富文本编辑器相关的模块 from cke ...
- 三十六、python 中subprocess介绍
import subprocess 1.执行系统命令subprocess.call('ipconfig') #shell=False时,拼接命令分开写,放在列表中,等于True时,可写一块,空格隔开例 ...
- 【cs231n作业笔记】一:KNN分类器
安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...
- Hbase——HA搭建
架构 master1,2 免秘钥登录 配置环境变量export HBASE_HOME=/root/hbase-0.99.2export PATH=$PATH:$HBASE_HOME/bin 修改配置文 ...
- 无障碍(Accessible Rich Internet Applications)
可访问性就是让你的网站能够尽可能为越来越多的人可用的做法,这意味着需要竭尽全力不要将任何访问信息的人挡在门外,仅仅因为他们可能有某些方面的残疾或者因为某些个人情况例如他们正在使用的设备.他们的网速.或 ...
- Map 接口有哪些类
Map接口 Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value:Map中的键值对以Entry类型的对象实例形式存在:建(key值)不 ...
- 测开之路一百零八:bootstrap表格
引入bootstrap和jquery 普通表格 html自带的边框线 bootstrap表格属性 bootstrap表格 边框线 鼠标经过变色 压缩表格,减小密度 自适应屏幕 隔行突出(变色) 表格里 ...
- STL关联容器值hashtable
hashtable(散列表)是一种数据结构,在元素的插入,删除,搜索操作上具有常数平均时间复杂度O(1); hashtable名词 散列函数:负责将某一元素映射为索引. 碰撞(collision):不 ...
- AngularJs——基础小知识(二)
AngularJs的过滤器 1.Currency :过滤器(金额货币格式化)
- django的多语言国际化
介绍 Django 支持国际化,多语言.Django的国际化是默认开启的,如果您不需要国际化支持,那么您可以在您的设置文件中设置 USE_I18N = False,那么Django会进行一些优化,不加 ...