2017 Multi-University Training Contest - Team 2 TrickGCD(组合数学)
题目大意:
给你一个序列An,然后求有多少个序列Bn
满足Bi<=Ai,且这个序列的gcd不为1
题解:
考虑这样做
枚举一个因子k,然后求出有多少个序列的gcd包含这个因子k
然后把结果容斥一下,我们会发现,这个容斥恰好就是求莫比乌斯函数
所以直接先预处理出来即可
于是k从2到n依次枚举,然后把结果乘以u(k)加到最后的答案里。
另一个问题是,如何快速求出有多少个序列呢,如果单纯的把每个数除以k然后加起来,就是n^2logn
显然会超时。
所以这里先把数存起来,然后整体来做
对于k来说,每次就枚举k,2k,3k.....m*k,然后可以得到,能包含k的数有多少个,2k的数有多少个,那么我们就可以在n/k的复杂度下统计出来有多少个序列
然后枚举k,最后就是n+n/2+...n/k = nlogn的复杂度了
(可能有更好的做法)
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
const int maxn = 1e5 + ;
const int MOD = ;
typedef long long LL;
LL minpri[maxn], H[maxn], a[maxn], ans[maxn], flag[maxn];
vector<int> prime;
const int maxlen=maxn;
int mu[maxlen],prinum[maxlen], len=;
void CalPri(){
int num[maxlen];
for(int i=;i<maxlen;i++)num[i]=i;
for(int i=;i<maxlen;i++){
if(num[i]==)continue;
prinum[len++]=i;
mu[i]=-;
for(int j=*i;j<maxlen;j+=i)
num[j]=;
}
}
void Calmu(){
CalPri();
mu[]=;
for(int i=;*i<=maxlen;i++){
for(int j=;j<len&&prinum[j]*i<maxlen;j++){
if(i%prinum[j]==){
mu[prinum[j]*i]=;
break;
}
mu[prinum[j]*i]=-mu[i];
}
}
} LL mypow(LL a, LL b){
LL ANS = ;
for(; b; b >>= ){ if(b&) (ANS *= a) %= MOD; (a *= a) %= MOD; } return ANS;
} int main()
{
int T, n;
cin>>T;
Calmu();
for(int ncase = ; ncase <= T; ncase++){
scanf("%d", &n);
memset(H, , sizeof(H));
memset(ans, , sizeof(ans));
LL ANS = , Max = , Min = 1e9;
for(int i = ; i <= n; i++) scanf("%d", &a[i]), H[a[i]]++, Max = max(Max, a[i]), Min = min(Min, a[i]);
for(int i = Max; i >= ; i--) H[i] += H[i+];
//for(int i = 1; i <= Max; i++) cout<<H[i]<<" "; cout<<endl;
for(int x = ; x <= Min; x++){
if(mu[x] == ) continue;
int tot = , lans = n;
for(int i = ; i*x <= Max; i++){
ans[tot] = lans - H[i*x];
lans = H[i*x];
tot++;
}
ans[tot] = lans;
//for(int i = 1; i <= tot; i++) cout<<ans[i]<<" "; cout<<endl;
LL temp = tot > ? : ;
for(int i = ; i <= tot; i++) (temp *= mypow(i, ans[i])) %= MOD;
(ANS += temp*(-mu[x])) %= MOD;
for(int i = ; i <= tot; i++) ans[i] = ;
}
(ANS += MOD) %= MOD;
cout<<"Case #"<<ncase<<": "<<ANS<<endl;
}
return ;
}
2017 Multi-University Training Contest - Team 2 TrickGCD(组合数学)的更多相关文章
- 2017 Multi-University Training Contest - Team 2 &&hdu 6053 TrickGCD
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 2017 Multi-University Training Contest - Team 9 1002&&HDU 6162 Ch’s gift【树链部分+线段树】
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
Big binary tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1006&&HDU 6038 Function【DFS+数论】
Function Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
随机推荐
- react初学
react和vue一样都是mvvm的这种开发模式. 下载js文件 引入HTML文件里 <!DOCTYPE html> <html> <head> <scrip ...
- djangorestframework怎么这么好用!
一年前就已经用过restframework, 当时觉得这个只是给web框架打辅助的, 他能实现的我也都实现(可能没有那么好用, 嘿嘿) 但是我有一种东西叫做效率, 时间就是金钱, 别人造好的就直接用就 ...
- 关于Vue的Render的讲解
首先我们传统的对于DOM的操作基本上都是通过js直接的获取一个节点,然后对DOM进行增加或者是删除.而Vue的Render这个函数是通过js虚拟的添加dom节点,然后虚拟的添加到html节点上去. 算 ...
- Cent OS 下 VI 使用方法
vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下: 1) 命 ...
- python三大神器之生成器
生成器Generator: 本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现) 特点:惰性运算,开发者自定义 在python中有三种方法来获取生成器: 1.通过生成 ...
- xpath简单入门
语法: 选取节点: 实例: (贴图转载自w3school) 补充: /a/@href #获取a标签的href属性 当<div class="demo">& ...
- shell重温---基础篇(连接数据库)
前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...
- FIFO的使用场景
(1) 数据的缓冲.如模型图所示,如果数据的写入速率高,但间隔大,且会有突发;读出速率小,但相对均匀.则通过设置相应深度的FIFO,可以起到数据暂存的功能,且能够使后续处理流程平滑,避免前级突发时,后 ...
- VS中的一些标记
1.//ToDO:此标记运行时会显示在任务列表窗口中.
- Linux-Shell脚本编程-学习-5-Shell编程-使用结构化命令-if-then-else-elif
if-then语句 if-then语句格式如下 if comman then command fi bash shell中的if语句可鞥会和我们接触的其他if语句的工作方式不同,bash shell的 ...