2017 多校2 hdu 6053 TrickGCD
2017 多校2 hdu 6053 TrickGCD
题目:
You are given an array \(A\) , and Zhu wants to know there are how many different array \(B\) satisfy the following conditions?
- \(1≤B_i≤A_i\)
- For each pair(\(l , r) (1≤l≤r≤n) , gcd(bl,bl+1...br)≥2\)
Input
The first line is an integer \(T(1≤T≤10)\) describe the number of test cases.
Each test case begins with an integer number n describe the size of array \(A\).
Then a line contains \(n\) numbers describe each element of \(A\)
You can assume that \(1≤n,A_i≤10^{5}\)
Output
For the \(k\)th test case , first output "Case #\(k\): " , then output an integer as answer in a single line . because the answer may be large , so you are only need to output answer mod \(10^{9}+7\)
思路:
枚举\(g = gcd(b_1,b_2,....,b_n)\),
那么\(gcd为g\)的倍数的答案就是\(\prod_{i=1}^{n}\frac{A_i}{g}\)
每次暴力计算是不行的,想到一个数在\(g到2g-1\)除以g结果是不变的
所以可以预处理区间数字个数的前缀和,\(O(nlogn)\)类似素数筛法预处理出每个\(g\)的答案
现在要计算\(gcd为g\)的答案,我们从大到小枚举,同时更新它的约数的答案,就可以保证不重复了
从小到大枚举过去就要用到莫比乌斯函数去计算了
\(令F(i)为gcd为i的倍数的方案数,f(i)为gcd为i的方案数\)
\(F(i) = \sum_{i|d}^{}{f(d)} \rightarrow f(i) = \sum_{i|d}u(\frac{d}{i})F(d)\)
代码贴的是比赛时过的姿势
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
vector<int> v[N];
int n;
int sum[N],ans[N];
void init(){
for(int i = 2;i < N;i++){
for(int j = i;j < N;j+=i) v[j].push_back(i);
}
}
int qpow(int x,int y){
int ans = 1;
while(y){
if(y&1) ans = 1LL* ans * x % mod;
x = 1LL * x * x % mod;
y >>= 1;
}
return ans;
}
int main(void)
{
init();
int T, x;
int cas = 1;
cin>>T;
while(T--){
memset(sum, 0, sizeof(sum));
scanf("%d",&n);
int mi = N;
for(int i = 1;i <= n;i++) {
scanf("%d",&x);
mi = min(x,mi);
sum[x]++;
}
for(int i = 1;i < N;i++) sum[i]+=sum[i-1];
for(int i = 2;i <= mi;i++){
ans[i] = 1;
for(int j = i;j < N;j+=i){
int l = j + i - 1 > N - 1?N-1:j + i - 1;
ans[i] = 1LL * ans[i] * qpow(j / i,sum[l] - sum[j - 1]) % mod;
}
}
int res = 0;
for(int i = mi;i >= 2;i--){
res = (res + ans[i])%mod;
for(int j = 0;j < v[i].size();j++) ans[v[i][j]] = (ans[v[i][j]] - ans[i] + mod)%mod;
}
printf("Case #%d: %d\n",cas++,res);
}
return 0;
}
2017 多校2 hdu 6053 TrickGCD的更多相关文章
- HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2
/* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...
- 2017 多校3 hdu 6061 RXD and functions
2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...
- HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法
题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...
- 2017 多校5 hdu 6093 Rikka with Number
2017 多校5 Rikka with Number(数学 + 数位dp) 题意: 统计\([L,R]\)内 有多少数字 满足在某个\(d(d>=2)\)进制下是\(d\)的全排列的 \(1 & ...
- hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】
题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html ...
- 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 ...
- HDU 6053 TrickGCD —— 2017 Multi-University Training 2
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 6053 TrickGCD 筛法
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Probl ...
- HDU 6053 TrickGCD(莫比乌斯反演)
http://acm.hdu.edu.cn/showproblem.php?pid=6053 题意:给出一个A数组,B数组满足Bi<=Ai. 现在要使得这个B数组的GCD值>=2,求共有多 ...
随机推荐
- 使用CSS隐藏HTML元素的四种常用方法
CSS隐藏HTML元素的四种常用方法 1.opacity:设置opacity: 0可以使一个元素变得完全透明. 设置的透明度会被子元素继承,而且无法取消. 通常可以使用opacity属性来制作元素的淡 ...
- Qt的QWebChannel和JS、HTML通信/交互驱动百度地图
Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...
- Choosing Capital for Treeland CodeForces - 219D (树形DP)
传送门 The country Treeland consists of n cities, some pairs of them are connected with unidirectional ...
- 边缘检测 opencv
本次实验使用了两种方法进行了边缘检测,分别使用到了opencv中的两个API函数为Canny()和Sobel()函数.实验后加了Scharr滤波器,它其实是基于Sobel()函数的. 这三个API中的 ...
- python创建字典
创建: {x:x**2 for x in (2,4,6)} dict(xjm=110,lxh=119,pzq=120) dict([('a',1),('b',2),('c',3)])
- HyperLedger Fabric 1.4 区块链技术形成(1.2)
在比特币诞生之时,没有区块链技术概念,当人们看到比特币在无中心干预的前提下,还能安全.可靠的运行,比特币网络打开了人们的想象空间:技术专家们开始研究比特币的底层技术,并抽象提取出来,形成区块链技术,或 ...
- POJ:3579-Median(二分+尺取寻找中位数)
Median Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9201 Accepted: 3209 Description Gi ...
- phpstorm调试配置 Xdebug
这已经楼主第二次因为phpstorm的调试配置折腾了几个小时,这次一定要记下来!!! 以Xdebug chrome浏览器为例 一:安装 JetBrains IDE Support 二:安装 Xdebu ...
- miniui IE对省略号即text-overflow:ellipsis显示不一样的问题
做miniui项目中发现,IE对文本以英文或数字结尾的是英文的省略号,以汉字结尾的就是中文的省略号.只要将字体变为统一宋体即可解决.即 .mini-grid-cell-inner { ...
- gulp相关
'use strict'; var gulp = require('gulp'), webserver = require('gulp-webserver'), //gulp服务器 connect = ...