1. 程式人生 > >bzoj2301 [HAOI2011]Problem b(求gcd==k的個數)(莫比烏斯反演+容斥原理)

bzoj2301 [HAOI2011]Problem b(求gcd==k的個數)(莫比烏斯反演+容斥原理)

首先我們搞掉下界,怎麼搞呢,用容斥原理即可。(看做矩形區間),然後我們需要求x=1ny=1ngcd(x,y)==k
x=1n/ky=1m/kgcd(x,y)==1
x=1n/ky=1m/kd|gcd(x,y)μ(d) 令n< m,
x=1n/kd|xμ(d)m/dk
d=1n/kμ(d)m/dkn/dk
分塊計算即可。

#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 bgcd==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 OneDP,,質因數分解

turn span sqrt %d 反向 $$ 沒有 轉移 ots stm這是div2的D題……我要對不住我這個紫名了…… 題目鏈接:CF原網 洛谷 題目大意:有個一開始為空的序列。每次操作會往序列最後加一個 $

BZOJ2301】【HAOI2011Problem 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