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 ...
随机推荐
- Windows环境下安装redis及PHP Redis扩展
附带管理工具安装教程 安装环境 WNMP环境 参考教程:WIN10下WNMP开发环境部署 安装windows的redis服务 安装包下载 选择msi安装包下载并安装,下载可能会有点慢,请自行使用梯子. ...
- PHP 面向对象编程笔记 (麦子 php 第二阶段)
类是把具有相似特性的对象归纳到一个类中,类就是一组相同属性和行为的对象的集合.类和对象的关系:类是相似对象的描述,先有类,再有对象.类是对象的抽象,对象是类的实例.通过class关键字创建类,成员属性 ...
- Mysql 5.7 开启远程连接
1 在控制台执行 mysql -uroot -p 系统提示输入数据库root用户的密码,输入完成后即进入mysql控制台 2 选择数据库 mysql -uroot -p use mysql; 开启远程 ...
- python继续函数-练习(2017-8-3)
写函数,计算传入字符串中[数字].[字母].[空格] 以及 [其他]的个数 def detection(p): intcount = 0 strcount = 0 othercount = 0 spa ...
- python函数(2017-8-2)
1. def 函数名(形式参数) 函数体 return "123" 函数执行了return之后就不再执行下面的代码 2. 默认形参实参的位置一一对应 如果要调整位置,指定形参名字 ...
- node Cookie
代码: const express = require('express'); const cookieParser = require('cookie-parser'); const app = e ...
- 2018 ccpc final I. Cockroaches
I. Cockroaches time limit per test6. s memory limit per test256 MB inputstandard input outputstandar ...
- Python3.6中PyInstaller不能对文件进行打包问题
上篇文章<itchat和matplotlib的结合使用爬取微信信息>是用python爬取信息得到微信朋友的信息,并且用matplotlib统计信息进行画图,所以今天想将它打包成.exe可执 ...
- java 第六章 面向对象基础
1.面向对象编程思想 面向过程编程 传统的C语言属于面向过程编程.面向过程解决问题的思路:通常是分析出解决问题所需要的步骤,然后用方法把这些步骤一步一步实现,最后一个一个依次调用方法来解决. 面向过程 ...
- PHP.39-扩展-锁机制解决并发-MySQL锁、PHP文件锁
锁机制适用于高并发场景:高并发订单.秒杀…… apache压力测试 Mysql锁详解 语法 加锁:LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE ......... ...