容斥原理應用 求1 r中有多少個數與n互素

2021-06-17 18:13:05 字數 710 閱讀 9328

問題:求1~r中有多少個數與n互素。

對於這個問題由容斥原理,我們有3種寫法,其實效率差不多。分別是:dfs,佇列陣列,位運算。

先說說位運算吧:

用二進位制1,0來表示第幾個素因子是否被用到,如m=3,三個因子是2,3,5,則i=3時二進位制是011,表示第2、3個

因子被用到

ll solve(ll n,ll r)

}if(n>1)

p.push_back(n);

ll ans=0;

for(ll msk=1; msk<(1《然後就是dfs的實現:

void solve(ll n)

}if(n>1)

p.push_back(n);

}void dfs(ll k,ll t,ll s,ll n)

dfs(k+1,t,s,n);

dfs(k+1,t+1,s*p[k],n);

}//主函式內是:

dfs(0,0,1,r);

經典題目:hdu4135,hdu2841,hdu1695,hdu3501

容斥原理求解1 r中和某個數m互質的數的個數

void get fac ll m 要找的m的素因子 if m 1 fac cnt m 如果乙個數有m的素因子,那麼他就一定不和m互質,比如30的素因子有2,3,5,那麼所有2的倍數就不和30互質,同理3的倍數,5的倍數也不和30互質,這裡假設要求1 30內和30互質的數,那麼r 30.設x1是2在...

容斥原理求1到n與k互質個數

參考部落格 傳送門 題目 hdu 4135 此處的k 1e9 include include include include includeusing namespace std typedef long long ll const int qq 10005 int num int prime qq...

求乙個數的二進位制中有多少個1

思路 首先,大部分人最先想到的解題方法是 獲得這個數的每個二進位制位上的數,然後判斷與1按位與 0 1 0,1 1 1 的結果是否等於1,若等於1,則說明這個二進位制位上的數是1,則計數加1,最後返回計數的結果。此外,還有另一種更簡單的解法 n n n 1 讓這個數n與n 1按位與再賦給n,它的意義...