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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

bzoj4330:JSOI2012 爱之项链

發(fā)布時(shí)間:2025/3/15 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj4330:JSOI2012 爱之项链 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目大意:一串項(xiàng)鏈由n個(gè)戒指組成,對于每個(gè)戒指,一共有M個(gè)點(diǎn),R種顏色,且旋轉(zhuǎn)后相同的戒指是相同的,然后一串項(xiàng)鏈又由N個(gè)戒指組成,同時(shí)要滿足相鄰的兩個(gè)戒指不能相同,這串項(xiàng)鏈上某個(gè)位置插入了一個(gè)特殊的東西,且如果特殊的東西插入的地方不同,即使戒指都是相同的,這兩串項(xiàng)鏈也是不同的,求一共有多少不同的愛之項(xiàng)鏈。

思路:首先可以求出一共有多少種不同的戒指,又由于有那個(gè)特殊的東西,相當(dāng)于這串項(xiàng)鏈即使旋轉(zhuǎn)后相同,但特殊的東西插入的位置也肯定是不同的,因此即不考慮旋轉(zhuǎn),只考慮相鄰位置不同的愛之項(xiàng)鏈的方案數(shù)。

令ans表示有多少種不同的戒指。

然后這樣就可以運(yùn)用容斥原理。對于第i個(gè)戒指和第i+1個(gè)戒指相同,可以看成第i個(gè)限制,然后第n個(gè)限制即第n個(gè)戒指和第1個(gè)限制不同,那么即要求滿足所有限制的方案數(shù)。令Si為滿足第i個(gè)限制的方案數(shù)的集合,那么即求S1~Sn的交,也就是其補(bǔ)集的并,那么就是總方案數(shù)減去所有不滿足任意一個(gè)限制數(shù)加上所有不滿足任意二個(gè)限制數(shù)......

然后這個(gè)式子是怎樣的呢,首先總方案數(shù)顯然就是ans^n,然后不滿足任意一個(gè)限制數(shù)即有兩個(gè)相鄰的相同,可以看成一條邊連接的兩個(gè)點(diǎn)相同,就是C(n,1)*ans^(n-1),以此類推,然后可以得到:sigma(0<=i<=n,(-1)^i*C(n,i)*ans^(n-i)),然后發(fā)現(xiàn)這就是二項(xiàng)式定理,就可以得到(ans-1)^n, 但真的就是這樣嗎?當(dāng)i=n時(shí),就會有一個(gè)Bug,用公式算得的答案是(-1)^n,然而n個(gè)限制均不滿足時(shí)的情況即所有顏色都一樣,有ans種,因此還要加上(n&1?1-m:m-1)才行。

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 #define p 3214567 8 #define maxn 200020 9 10 int m,r,tot; 11 int prime[maxn],phi[maxn]; 12 bool isprime[maxn]; 13 long long n; 14 15 int power(int a,long long k){ 16 if (k==0) return 1; 17 if (k==1) return a%p; 18 int x=power(a,k/2),ans=1ll*x*x%p; 19 if (k&1) ans=1ll*a*ans%p; 20 return ans; 21 } 22 23 int fphi(int x){ 24 int ans=x; 25 for (int i=2;i*i<=x;i++) 26 if (x%i==0){ 27 ans=ans-ans/i; 28 while (x%i==0) x/=i; 29 } 30 if (x!=1) ans=ans-ans/x; 31 return ans; 32 } 33 34 int main(){ 35 scanf("%lld%d%d",&n,&m,&r);tot=0,memset(isprime,1,sizeof(isprime)),phi[1]=1; 36 for (int i=2;i<maxn;i++){ 37 if (isprime[i]) prime[++tot]=i,phi[i]=i-1; 38 for (int j=1;j<=tot && i*prime[j]<maxn;j++){ 39 isprime[i*prime[j]]=0; 40 if (i%prime[j]==0){ 41 phi[i*prime[j]]=phi[i]*prime[j]; 42 break; 43 } 44 phi[i*prime[j]]=phi[i]*(prime[j]-1); 45 } 46 } 47 int ans=0; 48 for (int i=1;i*i<=m;i++) 49 if (m%i==0){ 50 ans=(ans+1ll*power(r,i)*fphi(m/i)%p)%p; 51 if (i*i!=m) ans=(ans+1ll*power(r,m/i)*phi[i]%p)%p; 52 } 53 ans=1LL*ans*power(m,p-2)%p; 54 int t=(1ll*power(ans-1,n)+(n&1?1-ans:ans-1))%p; 55 printf("%d\n",(t+p)%p); 56 return 0; 57 } View Code

轉(zhuǎn)載于:https://www.cnblogs.com/DUXT/p/5951747.html

總結(jié)

以上是生活随笔為你收集整理的bzoj4330:JSOI2012 爱之项链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。