日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu-1796 How many integers can you find---容斥定理

發(fā)布時間:2025/4/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu-1796 How many integers can you find---容斥定理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=1796

題目大意:

給定n和一個大小為m的集合,集合元素為非負整數。為1...n-1內能被集合里任意一個數整除的數字個數。n<=2^31,m<=10

解題思路:

容斥定理

枚舉m個元素的所有非空子集,求出lcm,如果子集元素數目為偶數那就減去,否則就加上。

挑戰(zhàn):P296有公式

1 #include<iostream> 2 using namespace std; 3 typedef long long ll; 4 const int maxn = 1e6 + 10; 5 ll n, m; 6 int a[50]; 7 ll gcd(ll a, ll b) 8 { 9 return b == 0 ? a : gcd(b, a % b); 10 } 11 void solve() 12 { 13 ll ans = 0; 14 for(int i = 1; i < (1 << m); i++) 15 { 16 int num = 0; 17 for(int j = i; j != 0; j >>= 1)if(j & 1)num++;//i的二進制中1的個數 18 ll lcm = 1; 19 for(int j = 0; j < m; j++) 20 { 21 if((1 << j) & i) 22 { 23 lcm = lcm / gcd(lcm, a[j]) * a[j]; 24 if(lcm > n)break; 25 } 26 } 27 if(num&1)ans += n / lcm; 28 else ans -= n / lcm; 29 } 30 cout<<ans<<endl; 31 } 32 int main() 33 { 34 while(cin >> n >> m) 35 { 36 n--;//需要自減1,因為是1-n-1 37 int tot = 0, x; 38 for(int i = 0; i < m; i++)//可能有0元素 39 { 40 cin >> x; 41 if(x)a[tot++] = x; 42 } 43 m = tot; 44 solve(); 45 } 46 return 0; 47 }

?

轉載于:https://www.cnblogs.com/fzl194/p/9075139.html

總結

以上是生活随笔為你收集整理的hdu-1796 How many integers can you find---容斥定理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。