/**
题目: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. 理解JS里的稀疏数组与密集数组

    一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...

  2. linux 的计划任务 cron

    https://serverfault.com/questions/587696/how-to-restart-php-fpm-from-cron 我也遇到了这个问题,想用cron 来启动php-fp ...

  3. 转:windows BAT 批处理脚本教程

    转自:http://www.cnblogs.com/mq0036/p/3412171.html BAT 批处理脚本教程 第一章 批处理基础第一节 常用批处理内部命令简介 批处理定义:顾名思义,批处理文 ...

  4. Java补漏(一)

     第一章前言 在学长的建议下,为了弥补之前学Java漏下的或者不是非常清楚的知识点,买了本蛮好的教科书-<Java学习笔记(JDK6)>,正式又一次学习.为了记下一些让我恍然大悟的知识 ...

  5. Unity命令行模式,也能「日志实时输出」

    转自自己的简书:http://www.jianshu.com/p/bd97cb8042a9 如果你使用过Unity命令行模式(batchmode),来实现Unity自动化编译构建,你肯定会遇到过这样的 ...

  6. Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显

    http://tieba.baidu.com/p/3038509618?fr=ala0&pstaala=3

  7. 详细解说 STL 排序(Sort)(转)

    作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sor ...

  8. Spring容器的属性配置详解的六个专题

    在spring IOC容器的配置文件applicationContext.xml里,有一些配置细节值得一提.我们将一些问题归结为以下几个专题.   专题一:字面值问题 配置的bean节点中的值,我们提 ...

  9. Java 线程池的原理与实现 (转)

        最近在学习线程池.内存控制等关于提高程序运行性能方面的编程技术,在网上看到有一哥们写得不错,故和大家一起分享. [分享]Java 线程池的原理与实现 这几天主要是狂看源程序,在弥补了一些以前知 ...

  10. docker build 的 cache 机制

    cache 机制注意事项 可以说,cache 机制很大程度上做到了镜像的复用,降低存储空间的同时,还大大缩短了构建时间.然而,不得不说的是,想要用好 cache 机制,那就必须了解利用 cache 机 ...