hdu6053 TrickGCD 容斥原理
- /**
- 题目: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 容斥原理的更多相关文章
- HDU-6053 TrickGCD
题目连接: https://vjudge.net/problem/HDU-6053 Description You are given an array A , and Zhu wants to kn ...
- [Hdu-6053] TrickGCD[容斥,前缀和]
Online Judge:Hdu6053 Label:容斥,前缀和 题面: 题目描述 给你一个长度为\(N\)的序列A,现在让你构造一个长度同样为\(N\)的序列B,并满足如下条件,问有多少种方案数? ...
- hdu 6053: TrickGCD (2017 多校第二场 1009) 【莫比乌斯 容斥原理】
题目链接 定义f[n]表示n是最大公约数情况下的计数,F[n]为n是公约数情况下的计数 (可以和 http://www.cnblogs.com/Just--Do--It/p/7197788.html ...
- HDU 6053 - TrickGCD | 2017 Multi-University Training Contest 2
/* HDU 6053 - TrickGCD [ 莫比乌斯函数,筛法分块 ] | 2017 Multi-University Training Contest 2 题意: 给出数列 A[N],问满足: ...
- HDU 6053 TrickGCD —— 2017 Multi-University Training 2
TrickGCD Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu4059 The Boss on Mars(差分+容斥原理)
题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设 则 为一阶差分. 二阶差分: n阶差分: 且可推出 性质: 1. ...
- hdu2848 Visible Trees (容斥原理)
题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
随机推荐
- windows Visual Studio 2017 编译 HEVC cmake-3.8.1-win64-x64.msi 下载
ttps://github.com/OpenHEVC/openHEVC 下载一 直接下载源码(可选)或下载源码包,我这里下载的是源码 打开 Visual Studio () 去 github 找到源码 ...
- [Angular] Two things about OnChanges Lifecycle hook
1. ngOnChanges is called before ngOnInit but after constructor() 2. ngOnChanges is called because of ...
- 求字符串A与字符串B的最长公共字符串(JAVA)
思路:引入一个矩阵的思想,把字符串A(长度为m)当成矩阵的行,把字符串B(长度为n)当矩阵的列.这样就构成一个m*n的矩阵.若该矩阵的节点相应的字符同样,即m[i]=n[j]时.该节点值为1:当前字符 ...
- 算法笔记_164:算法提高 最小方差生成树(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 给定带权无向图,求出一颗方差最小的生成树. 输入格式 输入多组测试数据.第一行为N,M,依次是点数和边数.接下来M行,每行三个整数U,V, ...
- HTML 的超链接 a 标签中如何设置其宽度和高度?
HTML 的超链接 a 标签中如何设置其宽度和高度? 在DIV CSS布局中,html 中 a 超链接标签,直接对其设置宽度和高度不能生效,设置宽度和高度也不起作用,这里为大家分享如何实现 a 标签宽 ...
- 批量部署 自动化之 - [pssh](转)
并行执行命令工具简介 作为运维工程师来讲,机器数量到一定级别的时候,批量运维和管理机器就是一件费神的事情,还好有很多可以批量并行执行命令的工具,比如 pssh , python fabrictaoba ...
- Navicat Premium如何打开SQL文件.MDF和.LDF文件
相信大家再装SQL Server时都会遇到一件很头疼的事情--装完SQL server之后发现没有启动程序.没有经验的会以为SQL SERVER安装失败了于是选择重装.可是呵呵,重装了4,5次还是一样 ...
- 【微信小程序】获取轮播图当前图片下标、滑动展示对应的位数、点击位数展示对应图片
业务需求: 3个图片轮番播放,可以左右滑动,点击指示点可以切换图片 index.wxml: 这里使用小程序提供的<swiper>组件autoplay:自动播放interval:自动切换时 ...
- jboss 的debug启动4法
http://xo-tobacoo.iteye.com/blog/684946方式一: 使用myeclipse,全自动化,不再赘述 方式二: eclipse下使用server工具,部署后使用debug ...
- bootstrap学习笔记 插件概述
Bootstrap插件概览 在前面布局组件章节中所讨论的组件仅仅是个开始.Bootstrap自带的12种jQuery插件,扩展了功能,可以给站点添加更多的互动.即使您不是一名高级的js开发人员, 你也 ...