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 ...
随机推荐
- 记js里codePointAt()方法返回的结果的含义。
经过<字符串的扩展>和<字符编码的那些事>这两篇文章的阅读,大概了解js里codePointAt方法返回结果的含义. var str='
- 【ssh服务配置】
根据项目需求,搭建好拓扑图如下: 第一种验证方式:给予密码和用户名登录 Ssh server配置: 首先在服务器上创建一个rsa加密算法的秘钥对: 对ssh服务进行开启: 创建用户的虚拟终端登录界面: ...
- SQL优化之语句优化
昨天与大家分享了SQL优化中的索引优化,今天给大家聊一下,在开发过程中高质量的代码也是会带来优化的 网上关于SQL优化的教程很多,但是比较杂乱.整理了一下,写出来跟大家分享一下,其中有错误和不足的地方 ...
- 一个好用的C# HttpHelper类
/// <summary> /// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提 ...
- php-5.6.26源代码 - hash存储结构 - 初始化
初始化 有指定析构函数,在销毁hash的时候会调用,如:“类似extension=test.so扩展”也是存放在HashTable中的,“类似extension=test.so扩展”的module_s ...
- 利用phpspreadsheet切割excel大文件
背景: 利用phpspreadsheet可以轻松的解析excel文件,但是phpspreadsheet的内存消耗也是比较大的,我试过解析将近5M的纯文字excel内存使用量就会超过php默认的最大内存 ...
- 为什么不早点使用 Git...
教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013739628770 ...
- ruby 类库组成
一. 核心类库: 二.标准类库: 文本 base64.rb 处理Base64编码的模块 csv.rb CSV(Comma Separated Values)库 ruby 1.8 特性 ...
- spark优化系列一:参数介绍
1 spark on yarn常用属性介绍 属性名 默认值 属性说明 spark.yarn.am.memory 512m 在客户端模式(client mode)下,yarn应用master使用的内存数 ...
- 项目总结(二)->一些常用的工具浅谈
程序员是否应该沉迷于一个编程的世界,为了磨砺自己的编程技能而两耳不闻窗外事,一心只为写代码:还是说要做到各有涉猎,全而不精.关于这点每个人心中都有一套自己的工作体系和方法体系. 我一直认为,程序员你首 ...