/**
题目:hdu6053 TrickGCD
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6053
题意: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 思路:枚举2<=gcd<=misA; misA表示A数组最小的数。 当gcd==2. 贡献为: (a1/2)*(a2/2)*...*(an/2);所有2的倍数的组合。
当gcd==3. 贡献为: (a1/3)*(a2/3)*...*(an/3);所有3的倍数的组合。
当gcd==4.不需要计算因为在2中算过了。


gcd==6. 减去。因为2,3都算过6,所以多算了一次。
也就是按照容斥原理的做法。
如果gcd可以被一个素数的平方整除,那么该gcd不用计算。
否则:f(i) = (-1)^(k+1); k表示i这个数的素因子个数。 由于mu[i] = (-1)^k; 所以求mu之后取反。 对于确定的gcd==2,计算贡献:因为ai/2很多结果相同。[gcd,2*gcd)范围内的数/gcd的结果都是1,[2*gcd,3*gcd)范围内的数/gcd的结果都是2.。。。
所以贡献等于1^num1 * 2^num2 * 3^num3 ... (numi表示结果为1的数量。可以利用前缀和统计范围内的数。)
其他类比。
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL;
#define ms(x,y) memset(x,y,sizeof x)
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + ;
const int maxn = 1e5 + ;
vector<P> gd;///value, num;
int sum[maxn];
int vis[maxn], mu[maxn];
int prime[maxn], cnt;
void init()///莫比乌斯
{
memset(vis,,sizeof(vis));
mu[] = ;
cnt = ;
for(int i=; i<maxn; i++)
{
if(!vis[i])
{
prime[cnt++] = i;
mu[i] = -;
}
for(int j=; j<cnt&&i*prime[j]<maxn; j++)
{
vis[i*prime[j]] = ;
if(i%prime[j]) mu[i*prime[j]] = -mu[i];
else
{
mu[i*prime[j]] = ;
break;
}
}
}
for(int i = ; i < maxn; i++){
if(mu[i]!=){
gd.push_back(P(i,-mu[i]));
}
}
}
LL Pow(LL x, int y)
{
LL p = ;
while (y)
{
if (y & ) p = p*x%mod;
x = x*x%mod;
y >>= ;
}
return p;
}
int main()
{
int T, cas = ;
int n;
init();
cin >> T;
while (T--)
{
scanf("%d", &n);
ms(sum, );
int x, misx = INF;
for (int i = ; i < n; i++) {
scanf("%d", &x);
misx = min(misx, x);
sum[x]++;
}
for (int i = ; i < maxn; i++) {
sum[i] += sum[i - ];
}
LL ans = ;
int len = gd.size();
for (int i = ; i < len&&gd[i].first <= misx; i++) {
int gcd = gd[i].first;
LL cnt = ;
for (int j = gcd; j < maxn; j += gcd) {
cnt = cnt*Pow(j / gcd, sum[min(maxn - , j + gcd - )] - sum[j - ]) % mod;
}
ans = (ans + cnt*gd[i].second + mod) % mod;
//cout<<"gcd = "<<gcd<<endl;
//cout<<"ans = "<<ans<<endl;
}
//cout<<"ans = "<<ans<<endl;
printf("Case #%d: %lld\n", cas++, ans);
} return ;
}

hdu6053 TrickGCD 容斥原理的更多相关文章

  1. HDU-6053 TrickGCD

    题目连接: https://vjudge.net/problem/HDU-6053 Description You are given an array A , and Zhu wants to kn ...

  2. [Hdu-6053] TrickGCD[容斥,前缀和]

    Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...

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

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

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

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

  5. HDU 6053 TrickGCD —— 2017 Multi-University Training 2

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

  6. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  7. hdu2848 Visible Trees (容斥原理)

    题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...

  8. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  9. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

随机推荐

  1. nodejs之路-[0]安装及简易配置

    题外话: 之前写过ubuntu下编译nodejs- 传送门:Ubuntu15.04编译安装nodejsV0.12.3 只是如今基本在win下做开发了-. 就以这篇帖子为开头,作为我踏上nodejs之路 ...

  2. spinner自定义,效果如腾讯QQ账号选择时候的下拉列表

         下拉列表在android中自带spinner的有时候不太适合我们的界面,我们希望有自己的一种显示方法,那怎么办?自定义Spinner.效果如QQ账号选择一样.如图所以. 这种效果,如果你喜欢 ...

  3. redhat6.3 找不到libXP.so.6解决方法

    最近做redhat安装matlab2008a 操作,遇到上面的问题,先记录如下: 网上找到安装包:libXp-1.0.2-1mamba.x86_64.rpm 然后使用命令: sudo rpm -ivh ...

  4. [Functional Programming ADT] Create State ADT Based Reducers (applyTo, Maybe)

    The typical Redux Reducer is function that takes in the previous state and an action and uses a swit ...

  5. 云计算之路-试用Azure:一次失败的SQL Server向SQL Azure的迁移尝试

    如果数据库用的是SQL Server,那SQL Azure无疑是最吸引人的地方之一.在测试了虚拟机磁盘IO之后,我们迫不急待地进行了SQL Azure的测试. (一) 首先进入manage.windo ...

  6. Office 如何复印身份证正反面到一张纸上

    先把身份证任意一面放到打印机扫描的一侧(不要放到正中间)   正面扫描复印好之后,身份证翻面,还放在原来的位置   纸张拿出来之后,把已经有图案的放在上面,空白的留在下面,接着扫描   最后效果如下 ...

  7. Win7如何更改网络位置,如何加入或创建家庭组

    1 打开网络和共享中心,点击连接上网的哪一个网络,点击把公用网络改为家庭网络   2 依次执行下一步     3 如果是加入一个家庭组,则输入家庭组的密码,否则将得到一个家庭组的密码   4 加入成功 ...

  8. vue - node_modules

    详情见:node_modules导包机制 在打包或者结束项目时,这个文件夹(node_modules)不应该被打包. 你应该打包其它的文件,如果要运行(直接用以下命令安装即可,它会根据package. ...

  9. 一步一步学Spring.NET——1、Spring.NET环境准备

    Spring.NET 1.3.2下载地址:http://down.51cto.com/data/861700 下载后解压 Spring.NET-1.3.2.7z:这个里面有我们须要用到的全部东西. S ...

  10. js foreach函数 注意事项(break、continue)

    foreach API说明: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Arra ...