HDU 4135 Co prime 容斥原理

2021-07-23 09:25:39 字數 1279 閱讀 1070

題目鏈結

統計在大區間[a,b]中與n互質的數的個數,其中a,b都在10的15次方級。

暴力肯定不行,正難則反,思考求[a,b]中不與n互質的數的個數,那麼該數必然是n的其中乙個因子的倍數,所以首先對n的所有因子進行打表,然後根據每乙個因子求在[a,b]區間中其倍數的個數。

在不同的因子進行計數的時候可能產生重複,所以進行容斥。

最後,小技巧將區間轉化成[1,b]-[1,a-1]求更加方便。

兩種容斥的形式:

vis[i]-num[i]通用型:

ac**:

#include 

typedef

long

long ll;

const

int n=1e5;

using

namespace

std;

ll a,b,n;

int p[n];

int num[n],vis[n];

int main()

}sort(p,p+count);

for(int i=0;i1;

vis[0]=0;

ll ans=0;

for(int i=0;i1ll*(b/p[i]-(a-1)/p[i])*(vis[i]-num[i]);

ll tmp=vis[i]-num[i];

for(int j=i;jif(p[j]%p[i]==0)

num[j]+=tmp;

}printf("case #%d: %lld\n",++cnt,b-a+1-ans);

}return

0;}

二進位制狀態壓縮容斥原理:

ac**:

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

ll co_prime(ll n, ll m)//求1-m中有多少個數與n互質

}if(n>1)

prime.push_back(n);

ll len=(1

<1; //狀態壓縮的所有狀態數

ll cnt, t;

for(i=1;i<=len;i++)

return m-ret;

}int main()

return

0;}

hdu4135 co prime 容斥原理

題意 給定a b c,求a到b區間內與c互質的數。思路 求a到b之間的與c互素的數,等價於求1到b之間與c互素的數減去1到a之間與c互素的數。求 中與 互質的數的個數都是用尤拉函式,但如果 比較大或者是求 中與 互質的數的個數等等問題,要想時間效率高的話還是先對n分解質因數然後用容斥原理,這裡可以用...

hdu 4135 Co prime 容斥原理

題目 大意 求區間 a,b 內與n互質的數的個數。分析 單純來逐個判斷互質統計結果肯定會超時,那麼可以對n素因子分解,以素因子的個數作為迴圈的上界 第二層迴圈 第一層是列舉素因子,運用容斥原理來統計不互質的個數,最後再用總數減去不互質的個數就是互質的個數。容斥原理也就是提供了這樣間接求解的思想 先不...

hdu4135Co prime 容斥原理

題意 給定a b c,求a到b區間內與c互質的數。分析 我們可以先轉化下 用 1,b 區間與n互質的數的個數減去 1,a 1 區間與n互質的數的個數,那麼現在就轉化成求 1,m 區間於n 互質的數的個數,如果要求的是 1,n 區間與n互質的數的個數的話,我們直接求出n的尤拉函式值即可,可是這裡是行不...