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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ1485: [HNOI2009]有趣的数列

發布時間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ1485: [HNOI2009]有趣的数列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題解:考慮按順序從小到大,加入數字,將加入奇數位置看作入棧,加入偶數位置看作出棧。為什么可以?考慮我們要保證相鄰奇數小于偶數,所以必須先填上一個奇數的位置才能填偶數的位置,既時刻保證奇數>=偶數,最終奇數等于偶數。觀察到這個性質,我們應該聯想到卡特蘭數了,套用公式求解。本題模數可能為合數,不一定存在逆元!!所以,要分解開計算,最后合并起來。順便試了下常數優化。。。然而本人代碼太丑,怕是救不回來了。

#include <bits/stdc++.h> typedef unsigned long long ull; using namespace std; int notp[2000007],num[2000007],nxt[2000007],n,P,p[2000007],tn; void init() {notp[1]=1;nxt[1]=1; tn = (n<<1);for(register int i=1;i<=tn;++i) {if(!notp[i])p[++p[0]]=i,nxt[i]=i;for(register int j=1;j<=p[0]&&p[j]*i<=tn;++j) {notp[i*p[j]]=1;nxt[i*p[j]]=p[j];if(i%p[j]==0)break;}} } inline void add(ull a,ull v) {while(a != 1) {num[nxt[a]]+=v;a/=nxt[a];} } inline ull q_pow(ull a,int b) {ull ans=1;while(b) {if(b&1)ans=(ans*a)%P;a=(a*a)%P;b>>=1;}return (int)ans; } inline ull merge() {ull ans = 1;register int i;for( i=1; i<=p[0]; i+=3) {ans = (ans%P*q_pow(p[i],num[p[i]])%P)%P;ans = (ans%P*q_pow(p[i+1],num[p[i+1]])%P)%P;ans = (ans%P*q_pow(p[i+2],num[p[i+2]])%P)%P;}for(;i<=p[0];++i) ans = (ans%P*q_pow(p[i],num[p[i]])%P)%P;return ans%P; } inline void write(ull x) {if(x>=10)write(x/10);putchar(x%10+'0'); } // (while) better than (for) // (!=) better than (>) // (int) better than (ull) better than (ll) int main() {scanf("%d%d",&n,&P);init();for(ull i=1;i<=tn;++i) add(i,1);for(ull i=1;i<=n;++i) add(i,-2);add(n+1,-1);write(merge()); }

  

?

轉載于:https://www.cnblogs.com/RRRR-wys/p/8935902.html

總結

以上是生活随笔為你收集整理的BZOJ1485: [HNOI2009]有趣的数列的全部內容,希望文章能夠幫你解決所遇到的問題。

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