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. ubuntu更换源

    1.备份源 cd  /etc/apt/ sudo cp sources.list sources.list.bak 2.更换阿里源 sudo vim /etc/apt/sources.list   中 ...

  2. JS-Promise(使异步操作同步执行)

    单个异步操作同步 <div id="box"></div> <script> var box = document.querySelector( ...

  3. java sftp.exec无法执行mv命令

    编写java程序过程中,sftp上传下载建目录删除文件都可以,就是备份不行. 分析原因如下: 1.如果用的同一个用户,即sftp用户来通过 exec(ssh连接) 执行mv命令,那极有可能是在搭建sf ...

  4. jmeter之关联的使用(正则、json)

    部分接口的测试中,一个接口会依赖上一个接口的响应信息,但上一个接口的响应信息又不是固定不变的,这时候,需要提取上一个接口的响应信息,将二者每一次的信息关联起来 目录 1.应用场景 2.jmeter正则 ...

  5. Entity Framework Code First (五)Fluent API - 配置关系 转载 https://www.cnblogs.com/panchunting/p/entity-framework-code-first-fluent-api-configuring-relationships.html

    上一篇文章我们讲解了如何用 Fluent API 来配置/映射属性和类型,本文将把重点放在其是如何配置关系的. 文中所使用代码如下 public class Student { public int ...

  6. Docker安装Web前端性能测试工具Sitespeed.io

    一.Sitespeed.io概述 1.Sitespeed.io简介 Sitespeed.io:是一款开源的Web性能测试工具,用来衡量Web网站的综合性能,帮助开发和测试人员分析网页的加载速度和渲染性 ...

  7. MySQL 查询语句--------------进阶9:联合查询

    #进阶9:联合查询 /* union 联合 合并:将多条查询语句的结果合并成一个结果 语法: 查询语句1 union 查询语句2 union..... 应用场景:要查询的结果来自于多个表,且多个表没有 ...

  8. 1、Laravel 环境配置及安装

    一.开发工具及环境 PHPStorm + phpStudy 最新版 Composer 安装 https://www.phpcomposer.com/ 下载就可以,设置中国镜像 安装完成后 compos ...

  9. C# 身份证号码验证正则和验证函数

    做身份证验证的时候要求能够按照标准18位身份证验证,普通正则表达式不能满足需求,所以在网上找到了这个函数,很好用,虽然还是有漏洞,不过一般乱填的号码都能被屏蔽掉 身份证验证函数(标准18位验证) pr ...

  10. java调用数据库中的函数和存储过程

    1.调用函数 {?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name&g ...