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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

8的倍数——题解(容斥原理)

發布時間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 8的倍数——题解(容斥原理) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述


小x最近對數字8很感興趣,有8進制,2008奧運會之類的。
現在小x想知道,在[x,y]區間里,有多少個數能被8整除。
小y覺得題目太簡單,于是給出n個其他數,問在[x,y]區間里,有多少個數能被8整除且不能被這n個數整除


分析

啊啊啊啊啊,一道很水的容斥原理啦QWQ,枚舉出這個n個數所有和8的lcm的情況,奇減偶加,這道題最麻煩的地方在于枚舉出所有的情況,看那些超級大佬都是dfs枚舉情況,蒟蒻的我實在太菜(lan)了,就用二進制枚舉情況咯!!!

//By Bibi /// .-~~~~~~~~~-._ _.-~~~~~~~~~-. /// __.' ~. .~ `.__ /// .'// \./ \\`. /// .'// | \\`. /// .'// .-~"""""""~~~~-._ | _,-~~~~"""""""~-. \\`. /// .'//.-" `-. | .-' "-.\\`. /// .'//______.============-.. \ | / ..-============.______\\`. /// .'______________________________\|/______________________________`. #include<bits/stdc++.h> #define rep(i,a,b) for(long long i=a;i<=b;++i) #define dep(i,a,b) for(long long i=a;i>=b;--i) using namespace std; const long long MAXN=20; typedef long long ll; ll read(){ll sum=0,flag=1;char c;for(;c<'0'||c>'9';c=getchar())if(c=='-') flag=-1;for(;c>='0'&&c<='9';c=getchar())sum=(sum<<1)+(sum<<3)+c-'0';return sum*flag; } ll n; ll a[MAXN]; ll ans1,ans2; ll x,y; ll gcd(ll a,ll b){return b? gcd(b,a%b):a; } void init(){n=read();rep(i,0,n-1) a[i]=read();x=read();y=read(); } void work1(){rep(i,0,(1<<n)-1){ll tot=0,true_num=8;rep(j,0,n-1){if(i&(1<<j)){true_num*=a[j]/gcd(true_num,a[j]);if(true_num>x-1) break;tot++;}}if(tot&1) ans1-=(x-1)/true_num;else ans1+=(x-1)/true_num;} } void work2(){rep(i,0,(1<<n)-1){ll tot=0,true_num=8;rep(j,0,n-1){if(i&(1<<j)){true_num*=a[j]/gcd(true_num,a[j]);if(true_num>y) break;tot++;}}if(tot&1) ans2-=(y)/true_num;else ans2+=(y)/true_num;} } int main(){init();work1();work2();printf("%lld\n",ans2-ans1);return 0; }

總結

以上是生活随笔為你收集整理的8的倍数——题解(容斥原理)的全部內容,希望文章能夠幫你解決所遇到的問題。

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