题目大意:

给你一个序列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(组合数学)的更多相关文章

  1. 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 ...

  2. 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) ...

  3. 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 ...

  4. 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 ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. [异常笔记]required a bean of type 'org.quartz.JobExecutionContext' that could not be found

    *************************** APPLICATION FAILED TO START *************************** Description: Par ...

  2. 【ospf-路由聚合】

  3. Mysqldump自定义导出n条记录

    很多时候DBA需要导出部分记录至开发.测试环境,因数据量需求较小,如果原库的记录多,且表数量也多,在用mysqldump命令导出时可以添加一个where参数,自定义导出n条记录,而不必全量导出. 示例 ...

  4. JZOJ 5941. 乘

    Sample Input Sample Input1: 4 3 9 6 5 8 7 7 Sample Output Sample Output1: 0做法(转自JZOJ):考虑 a 是定值, 而 b ...

  5. 9-C++远征之多态篇-学习笔记

    C++远征之多态篇 面向对象三大特征:封装,继承,多态 多态: 发出一条命令时,不同的对象接收到同样的命令做出的动作不同 多态篇会学习到的目录: 普通虚函数 & 虚析构函数 纯虚函数:抽象类 ...

  6. loj136 (最小瓶颈路,多次询问)

    题目描述 给定一个包含 n nn 个节点和 m mm 条边的图,每条边有一个权值.你的任务是回答 k kk 个询问,每个询问包含两个正整数 s ss 和 t tt 表示起点和终点,要求寻找从 s ss ...

  7. Spring 的好处?

    1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦 2.可以使用容易提供的众多服务,如事务管理,消息服务等 3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监 ...

  8. Android使用butterknife注解出现nullPointerException解决

    1.下载butterknife加入到你的libs中,构建到你的项目中,此时还不能注解成功,必须进行2配置 2.选择你的项目右键---->properties----->java compi ...

  9. PHP.39-扩展-锁机制解决并发-MySQL锁、PHP文件锁

    锁机制适用于高并发场景:高并发订单.秒杀…… apache压力测试 Mysql锁详解 语法 加锁:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE ......... ...

  10. 2457: [BeiJing2011]双端队列

    2457: [BeiJing2011]双端队列 链接 很奇妙的转化. 题目要求最后的所有序列也是有序的,所以可以求出最后的序列(即排序后的序列),然后分成许多份,要求每一份都是一个双端序列,求最少分成 ...