POJ - 1091 跳蚤(容斥原理+数论)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 1091 跳蚤(容斥原理+数论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:中文題意,不多贅述
題目分析:根據題目的意思,其實只需要讓所有數的最大公約數為1就可以滿足條件,好像是用到了歐幾里得的一些知識,奈何我的數論比較菜,也不會證明,就直接用網上大牛們的結論吧,題目說了第n+1個數已經幫我們選好了,為m,所以我們只需要找出有多少種情況選擇n個與m互質的數就是題目所求了,不過正難則反,我們可以求有多少組數與m是有不互質的,用總數減去當前答案數就是最后要求的最終答案了,這樣問題就轉換為了求1~m中有多少個數與n互質,不過這個題目稍微有一點點的變化就是并不是直接詢問的個數,而是排列組合數,給出的n就是起到了這個用處,因為對于1~m中的任意一個數x,其都可以在n個位置出現,所以總的方案數為m^n,而每次需要操作的答案也是需要加一個n次冪就好了,舉個很簡單的例子想一下,比如現在我們需要求與m的公因子p不互斥的數有num個,求出這個答案后,這num個數可以互相搭配,在這個題目做出的貢獻就是num^n了
一開始看到m是1e8,三次方就爆掉longlong了,但好像是由于數據比較水,用longlong就能水過,所以也不用大費周折的去開高精度來做啦
代碼:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=210;LL q_pow(LL a,LL b) {LL ans=1;while(b){if(b&1)ans*=a;a*=a;b>>=1;}return ans; }vector<int>fact;LL solve(LL n,LL m) {fact.clear();LL temp=m;for(LL i=2;i*i<=temp;i++){if(temp%i==0){fact.push_back(i);while(temp%i==0)temp/=i;}}if(temp>1)fact.push_back(temp);LL ans=0;for(int i=1;i<(1<<fact.size());i++){LL cnt=0;LL mul=1;for(int j=0;j<fact.size();j++){if(i&(1<<j)){cnt++;mul*=fact[j];}}if(cnt&1)//奇加偶減 ans+=q_pow(m/mul,n);elseans-=q_pow(m/mul,n);}return q_pow(m,n)-ans; }int main() { // freopen("input.txt","r",stdin); // ios::sync_with_stdio(false);LL n,m;while(scanf("%lld%lld",&n,&m)!=EOF)printf("%lld\n",solve(n,m));return 0; }?
總結
以上是生活随笔為你收集整理的POJ - 1091 跳蚤(容斥原理+数论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU - 4135 Co-prime(
- 下一篇: 洛谷 - P3357 最长k可重线段集问