bzoj2301 [HAOI2011]Problem b(求gcd==k的個數)(莫比烏斯反演+容斥原理)
首先我們搞掉下界,怎麼搞呢,用容斥原理即可。(看做矩形區間),然後我們需要求
分塊計算即可。
#include <cstdio>
#include <cstring>
#define ll long long
#define N 50000+5
int T,a,b,c,d,k,mu[N],prime[N],tot=0 ;
bool notprime[N];
inline int swap(int &x,int &y){int t=x;x=y;y=t;}
inline int min(int x,int y){return x<y?x:y;}
void Mobius(){
memset(notprime,0,sizeof(notprime));
mu[1]=1;notprime[1]=1;
for(int i=2;i<=50000;++i){
if(!notprime[i]){
prime[++tot]=i;mu[i]=-1;
}
for (int j=1;prime[j]*i<=50000;++j){
notprime[prime[j]*i]=1;
if(i%prime[j]==0){
mu[prime[j]*i]=0;break;
}
mu[prime[j]*i]=-mu[i];
}
}
for(int i=2;i<=50000;++i) mu[i]+=mu[i-1];
}
ll ANS(int n,int m){
ll re=0;int last=0;
n/=k;m/=k;if (n>m) swap(n,m);
for(int i=1;i<=n;i=last+1){
last=min(n/(n/i),m/(m/i));
re+=(ll)(mu[last]-mu[i-1])*(n/i)*(m/i);
}
return re;
}
int main(){
// freopen("a.in","r",stdin);
Mobius();
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
//容斥原理搞掉下界
printf("%lld\n",ANS(b,d)-ANS(a-1,d)-ANS(b,c-1)+ANS(a-1,c-1));
}
return 0;
}
相關推薦
bzoj2301 [HAOI2011]Problem b(求gcd==k的個數)(莫比烏斯反演+容斥原理)
首先我們搞掉下界,怎麼搞呢,用容斥原理即可。(看做矩形區間),然後我們需要求∑x=1n∑y=1ngcd(x,y)==k。 ∑x=1⌊n/k⌋∑y=1⌊m/k⌋gcd(x,y)==1 ∑x=1⌊n/k
TrickGCD(莫比烏斯反演+容斥定理)
連結:http://acm.hdu.edu.cn/showproblem.php?pid=6053 hdu6053 TrickGCD 題目解析: 令sum[k]為k能夠出現的個數 eg: Input 3 6 6 9 各個數字出現的情況 1 1 1 2 2 2 3 3
[BZOJ2301]Problem b 莫比烏斯反演+容斥
題意明確,就是求∑i=ab∑j=cdgcd(i,j)==k 首先容易發現容斥定理,轉化為求 ∑i=1n∑j=1mgcd(i,j)==k 我們設f(d)=∑i=1n∑j=1m(gcd(i,j)==d
6053 TrickGCD(莫比烏斯反演+容斥思想+分塊字首和技巧)
題目大意: 給你一個數組 A ,問你有多少不大於 A 的陣列 B 使得 B 中所有元素的最大公因數不為1。(陣列 B 不大於陣列 A 就等價於,對於任意 A 陣列中的元素 a [ i ] 和 B 陣列中對應元素 b [ i ] ,均有:a [ i ] >
cf 990G GCD Counting (莫比烏斯反演 並查集)
In http 自己 har urn merge cto count read 990G 給你一棵樹,問你有多少個點對(x,y)(x\(\leq\)y),使得(x,y)簡單路徑上的點權值的\(gcd\)為\(i\),對於\(i\in [1,200000]\)輸出點對數目。
【BZOJ4815】[CQOI2017]小Q的表格(莫比烏斯反演,分塊)
【BZOJ4815】[CQOI2017]小Q的表格(莫比烏斯反演,分塊) 題面 BZOJ 洛谷 題解 神仙題啊。 首先\(f(a,b)=f(b,a)\)告訴我們矩陣只要算一半就好了。 接下來是\(b*f(a,a+b)=(a+b)*f(a,b)\) 這個式子怎麼看呢? \[\begin{aligned}
[BZOJ4652/UOJ#221][NOI2016]迴圈之美(莫比烏斯反演+杜教篩)
Address Solution…… 一、 O(nm)O(nm) 我們知道, kk 進位制小數 0.0000000...10000000..10000000..1...0.0000000...10000000..10000000..1... (迴圈
BZOJ 3529 數表 (莫比烏斯反演+樹狀陣列)*
#include<bits/stdc++.h> using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++) #def
[BZOJ4176]Lucas的數論(莫比烏斯反演+杜教篩)
題目描述 傳送門 題解 做約數個數和的時候有一個結論: d(nm)=∑i|n∑j|m[(i,j)=1] 直接套進去 ∑i=1n∑j=1m∑x|i∑y|j[(x,y)=1] 然後根據反演公式
HDU 5663 Hillan and the girl(莫比烏斯反演+分塊求和)
大致題意:給你兩個數字n和m,讓你求,其中f(i,j)表示gcd(i,j)是否為完全平方數,如果是則f(i,j)==0,否則為f(i,j)==1。 首先,有了之前 BZOJ 2301 的經驗,這道題目可以比較簡單的講。BZOJ 2301 這題是求一定範圍內的兩個
HDU 6134 && 2017 多校訓練:Battlestation Operational(莫比烏斯反演+積性函式)
實在太長了直接放題目連結 這題就是求 考慮當Gcd(i, j)==1時,除了j為1的情況,其它時候i/j一定是小數,所以i/j向上取整相當於向下取整的結果+1 那麼有:(其中φ(i)為小於i與i
CF1139D Steps to One(DP,莫比烏斯反演,質因數分解)
turn span sqrt %d 反向 $$ 沒有 轉移 ots stm這是div2的D題……我要對不住我這個紫名了…… 題目鏈接:CF原網 洛谷 題目大意:有個一開始為空的序列。每次操作會往序列最後加一個 $
【BZOJ2301】【HAOI2011】Problem B(莫比烏斯反演)
題面 Description 對於給出的n個詢問,每次求有多少個數對(x,y),滿足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函式為x和y的最大公約數。 Input 第一行一個整數n,接下來n行每行五個整數,分別表示a、
BZOJ 2301: [HAOI2011]Problem b(莫比烏斯反演)
計算 algo cto ref blog image get txt += http://www.lydsy.com/JudgeOnline/problem.php?id=2301 題意:對於給出的n個詢問,每次求有多少個數對(x,y),滿足a≤x≤b,c&l
【bzoj2301】[HAOI2011]Problem b 莫比烏斯反演
== define sum ostream namespace char lin iostream get Description 對於給出的n個詢問,每次求有多少個數對(x,y),滿足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x
[HDU1695]GCD + [HAOI2011]Problem b + [POI2007]ZAP-Queries【莫比烏斯反演】
最終 floor line cas pri int += problem cpp [HDU1695]GCD [HAOI2011]Problem b [POI2007]ZAP-Queries 令\[ans(n, m)=\sum_{i=1}^n\sum_{j=1}^m[GCD(
bzoj[HAOI2011]Problem b(莫比烏斯反演)
原題連結 題目描述:對於給出的n個詢問,每次求有多少個數對(x,y),滿足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函式為x和y的最大公約數。 輸入格式:第一行一個整數n,接下來n行每行五個整數,分別表示a、b、c、d、k 輸出格式:共n行,每行一個整數表示滿足要求的數對(x,
莫比烏斯反演入門 HDOJ 1695:GCD 、BZOJ 2301: [HAOI2011]Problem b
下面我所說的都基於上面這篇部落格的內容。 莫比烏斯反演有兩種形式(mu表示莫比烏斯函式): HDOJ1695 GCD 求1<=x<=n,1<=y<=m中gcd(x,y)==k的(x,y)組數,注意(a,b)和(b,a)視為同一情況。 相當於計算
[莫比烏斯反演] bzoj2301: [HAOI2011]Problem b
因為不保證a,c=1 減掉1~a和1~d 1~c和1~b 的匹配 然後把重複的1~a和1~c的匹配加回來 然後就T掉了nice! 加一個分塊加速 因為有很大一段的(b/i) (d/i)
bzoj 2301 [HAOI2011]Problem b (莫比烏斯反演)
題目大意:已知x\in [a,b],y\in [c,d],求gcd(x,y)為k的有序數對數量 a,b,c,d,k及詢問數<=50000 比yy的gcd好做一些吧 轉化題目,直接求解比較困難,利用容斥原理,問題轉化為求$ans(b,d)-ans(a-1,d)-ans(b,c-1)+ans(a-1,c