容斥原理 求 1 m 中與m不互質的數的個數

2021-08-19 03:17:32 字數 1799 閱讀 3947

//容斥原理的實現

//1.佇列陣列

//3.二進位制表示

//佇列陣列是列舉所有情況,可能有時候空間上存不下?dfs的優點是用時間換空間

ps:1.int fac[15]

//13! > 1e8,所以質因子的個數小於15 //long long 的話21! > ull,25肯定夠

2.二進位制

注意空集不要算

//3.如果要求[1..n]中與m不互質的數的個數,即二進位制列舉子集,求子集所有數字的lcm,n / lcm即可

1.佇列陣列

m = p1 ^ x1 * p2 ^ x2 * ... * pk ^ xk,求小於等於m的,整除p1或p1或...pk的數的個數

#include

#include

#include

usingnamespace

std;

const

int maxn =1e5 +5;

intq[

maxn

],fac[

15],num;//佇列陣列q,fac記錄m的質因子,num記錄質因子個數

void divide(int m)

if(m == 1)break;

}if(m != 1)fac[num ++] = m;

}int

solve(

intm)//小於等於m中,和m不互質的數的個數

}//計算a並b並c...個數

int ans = 0;

for (int i =1; i < sz; i ++)

return ans;

}int main()

return0;

}#include

#include

#include

usingnamespace

std;

typedeflong longll;

intfac[

15],num;

intm;

void divide(int m)

if(m == 1)break;

}if(m != 1)fac[num ++] = m;

}//其實本質上就是列舉所有情況,和二進位制列舉沒啥區別

//pos為當前質因子的位置,cnt為當前公共因子的個數,搜尋含有c個公共因子的數的個數

int p[15];

int tmp = 0;

void dfs(int pos,int cnt,int c)

tmp += x;

return;

}for (int i = pos; i }int main()

printf("%lld\n",ans);

}return0;

}//3.二進位制

#include

#include

#include

usingnamespace

std;

typedeflong longll;

intfac[15],num;

void

divide(int m)

if(m == 1)break;

}if(m != 1)fac[num ++] = m;

}ll solve(int m)

t >>= 1;

if(t == 0) break;

}if(cnt & 1) ans += x;

else ans -= x;

}return ans;

}int

main()

return0;

}

容斥原理求解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...

質因子 容斥原理求與n互質的個數

求乙個數的質因子,將質因子儲存在a,並返回質因子的個數 int init ll n if n 1 這裡要記得 a idx n return idx 1 求 1,m 內與n互質的個數,用佇列陣列實現容斥原理 ll fid ll m for ll i 1 i t i sum sum m que i re...