TrickGCD

Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2523    Accepted Submission(s): 965

Problem Description
You are given an array A , and Zhu wants to know there are how many different array B satisfy the following conditions?

* 1≤Bi≤Ai
* 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,Ai≤1e5

 
Output
For the kth 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 1e9+7
 
Sample Input
1
4
4 4 4 4
 
Sample Output
Case #1: 17
 
题目大意:有数组A,根据1<=Bi<=Ai,且对于任意1<=l<=r<=n, gcd(Bl,Bl+1...Br)≥2 构造B数列
思路:B的最小值一定不会大于A的最小值,所以gcd(B1,B2,...,Bn)一定不大于A的最小值,那么我们可以求出A的最小值,对gcd为质数的情况求和,利用容斥原理减去重复的情况。在计算重复情况时,发现对于gcd是奇数个质数的乘积时是加,偶数个时是减,与莫比乌斯函数相反,那么就可以借助莫比乌斯函数求和。这里暴力求和会超时,问了学长之后才知道分桶计算可以快很多,涨姿势了。
 
AC代码:
 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int MAXN=1e5+;
const int MOD=1e9+;
LL miu[MAXN],primes[MAXN],tot=;
bool isprime[MAXN];
int a[MAXN],sum[MAXN];
int maxx=,minn=MAXN;
void getmiu()
{
memset(isprime, , sizeof((isprime)));
miu[]=;
for(int i=;i<MAXN;i++){
if(isprime[i]==false)
{
miu[i]=-;
primes[++tot]=i;//cout<<'*'<<endl;
}
for(int j=;j<=tot;j++){
if(i*primes[j]>=MAXN) break;
isprime[i*primes[j]]=;
if(i%primes[j]==){
miu[i*primes[j]]=;
break;
}
miu[i*primes[j]]=-miu[i];
}
} for(int i=;i<MAXN;i++) miu[i]=-miu[i];
}
LL quick_pow(LL a, LL p)
{
int res=;
while(p)
{
if(p&) res=a*res%MOD;
a=a*a%MOD;
p>>=;
}
return res;
}
int solve()
{
LL i,j,k,p;
LL ans=;
for(int i=;i<=minn;i++){
if(!miu[i]) continue;
LL res=;
j=min(i, maxx), k=min((i<<)-, maxx);
for(p=; ;p++)
{
if(sum[k]-sum[j-])
res=res*quick_pow(p, sum[k]-sum[j-])%MOD;
if(k==maxx) break;
j+=i;
k+=i;
if(k>maxx) k=maxx;
}
ans+=miu[i]*res;
if(ans>MOD) ans-=MOD;
if(ans<) ans+=MOD;
}
return ans%MOD; }
int main()
{
int T,n,t=;
getmiu();
scanf("%d", &T);
//cout<<'*'<<endl;
while(T--)
{
scanf("%d", &n);
maxx=,minn=MAXN;
memset(sum, , sizeof(sum));
for(int i=;i<n;i++){
scanf("%d", &a[i]);
sum[a[i]]++;
maxx=max(a[i], maxx);
minn=min(a[i], minn);
}
for(int i=;i<=maxx;i++) sum[i]+=sum[i-];
LL res=solve();
printf("Case #%d: %lld\n", ++t, res);
}
}

HDU 6053 TrickGCD —— 2017 Multi-University Training 2的更多相关文章

  1. HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2

    /* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...

  2. hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】

    题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html  ...

  3. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  4. HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9

    /* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...

  5. HDU 6053 TrickGCD 莫比乌斯函数/容斥/筛法

    题意:给出n个数$a[i]$,每个数可以变成不大于它的数,现问所有数的gcd大于1的方案数.其中$(n,a[i]<=1e5)$ 思路:鉴于a[i]不大,可以想到枚举gcd的值.考虑一个$gcd( ...

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

  7. hdu 6053 TrickGCD 筛法

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Probl ...

  8. hdu 6053 TrickGCD(筛法+容斥)

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  9. HDU 6053 ( TrickGCD ) 分块+容斥

    TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

随机推荐

  1. delphi 按钮 2 行

    http://bbs.csdn.net/topics/390230792 回复于: 2015-06-01 21:11:02 最简单的办法:------------------------以下是转载的, ...

  2. JavaScript高级程序设计(第3版) 第四章(变量、作用域和内存问题)

    4.1 基本类型和引用类型的值             1.基本类型的值是(简单的数据段),引用类型的值是(保存在内存中的对象). 基本类型的值在内存中占据固定大小的空间,因此被保存在栈中.(lifo ...

  3. SAP选择屏幕开发(一)(转)

    原文链接:https://blog.csdn.net/wtxhai/article/details/90632686 用户通过屏幕操作来实现与SAP的数据交互,而SAP的屏幕开发一般分为两种,一种是通 ...

  4. ubuntu18.04 安装 jdk

    1.当前路径(如果不想下载到当前路径,可以先cd到指定路径,再开始下载),官网下载JDK文件jdk-8u121-linux-x64.tar.gz $ wget https://download.ora ...

  5. vue 数组中嵌套的对象添加新属性--页面更新

    vue 数组中嵌套的对象添加新属性--页面更新:https://www.jianshu.com/p/8f0e5bb13735

  6. docker pull理解误区

    docker run 命令 如果local image中有对应 镜像+tag 不会从新拉取镜像 docker pull 会进行拉取 先进行镜像更改 [root@master01 ~]# docker ...

  7. 13、numpy——算术函数

    NumPy 算术函数 1.NumPy 算术函数包含简单的加减乘除: add(),subtract(),multiply() 和 divide(). 需要注意的是数组必须具有相同的形状或符合数组广播规则 ...

  8. Redis设计与实现 -- 链表与字典

    1. 链表 1.1 链表的结构 在 Redis 中,链表的实现是双向链表,除此之外与常规的链表不同的是它还有三个函数指针,dup 函数用于复制链表节点所保存的值,free 函数用于释放链表节点保存的值 ...

  9. JavaScript—— 案例:表单验证

    QQ号:<input type="text" id="txtQQ"><span></span><br> 邮箱:& ...

  10. elasticsearch 基础 —— 处理冲突及乐观并发控制

    处理冲突 当我们使用 index API 更新文档 ,可以一次性读取原始文档,做我们的修改,然后重新索引 整个文档 . 最近的索引请求将获胜:无论最后哪一个文档被索引,都将被唯一存储在 Elastic ...