题目大意:

给你一个序列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. python中的"is"与"=="比较

    在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同.莱布尼茨说过: ...

  2. php PHPEXcel导出

    1获取数据,2组装数据,3生成文件. 注意:无法使用ajax生成导出. $settlement = \Yii::$app->request->get('settlement'); $sav ...

  3. JDK8新垃圾回收机制--G1垃圾回收机制

    G1全称是Garbage First Garbage Collector,使用G1的目的是简化性能优化的复杂性.例如,G1的主要输入参数是初始化和最大Java堆大小.最大GC中断时间. G1 GC由Y ...

  4. Learning Experience of Big Data: Connect CentOs to Xshell and set Java environment on CentOS

    1.set up connections between vitural machine and Xshell: After we connect the virtural machine to ne ...

  5. STM32Cube 5.0 使用V1.7.0的固件库生成keil5环境下的F1工程时发现问题

    生成的stm32f1xx_hal_msp.c文件里面,HAL_MspInit(void)函数居然没有了之前1.6库里面的系统中断优先级的设置: /* MemoryManagement_IRQn int ...

  6. PyCharm使用秘籍视频

    PyCharm使用视频上传至企鹅群公告 需要自行添加群获取

  7. java性能测试工具 jprofiler

    1.下载地址 官方网址:http://www.ej-technologies.com/products/jprofiler/overview.html 2.Eclipse集成 该文(http://ji ...

  8. EIP权限工作流平台总结-1总体说明

      预览地址:www.eipflow.com (1) 权限工作流:www.demo.eipflow.com/Account/Login (2) 基础权限版:www.auth.eipflow.com/A ...

  9. Myeclipse报错-Java compiler level does not match 完美解决方法

    从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclipse报Description  Resource Path Location Type Java compiler level d ...

  10. PostgreSQL 数据库升级

    PostgreSQL软件版本升级后,需要使用pg_upgrade迁移旧版本的数据库,具体的操作参数可以参考官方文档,在此记录一下操作过程中出现的细节问题: 新版本软件在initdb的时候要保证loca ...