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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix

發(fā)布時(shí)間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?Tom and matrix

Problem's Link: ??http://acm.hdu.edu.cn/showproblem.php?pid=5226


?

Mean:?

題意很簡單,略。

?

analyse:

直接可以用Lucas定理+快速冪水過的,但是我卻作死的用了另一種方法。

方法一:Lucas定理+快速冪水過

方法二:首先問題可以轉(zhuǎn)化為求(0,0),(n,m)這個(gè)子矩陣的所有數(shù)之和。畫個(gè)圖容易得到一個(gè)做法,對于n<=m,答案就是2^0+2^1+...+2^m=2^(m+1)-1,對于n>m,答案由兩部分構(gòu)成,一部分是2^(m+1)-1,另一部分是sigma i:m+1->n f[i][m],f[i][m]表示第i行前m列的數(shù)之和,f數(shù)組存在如下關(guān)系,f[i][m]=f[i-1][m]*2-C[i-1][m],f[m][m]=2^m。還有另一種思路:第i列的所有數(shù)之和為C(i,i)+C(i+1,i)+...+C(n,i)=C(n+1,i+1),于是答案就是sigma i:0->min(n,m) C(n+1,i+1)。

Lucas定理:由于題目給定的模是可變的質(zhì)數(shù),且質(zhì)數(shù)可能很小,那么就不能直接用階乘和階乘的逆相乘了,需要用到Lucas定理,公式:C(n,m)%P=C(n/P,m/P)*C(n%P,m%P),c(n,m)=0(n<m)。當(dāng)然最終還是要預(yù)處理階乘和階乘的逆來得到答案。復(fù)雜度O(nlogP+nlogn)

Time complexity: O(n)

?

Source code:?

Lucas定理+快速冪?

/* * this code is made by crazyacking * Verdict: Accepted * Submission Date: 2015-05-21-23.28 * Time: 0MS * Memory: 137KB */ #include <queue> #include <cstdio> #include <set> #include <string> #include <stack> #include <cmath> #include <climits> #include <map> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #define LL long long #define ULL unsigned long long using namespace std;const int maxn=100010; struct cell {int x,y;bool operator<(cell c) const{return x==c.x?(y<c.y):(x<c.x);} }p[2]; LL mod; LL Pow(LL a,LL b) {LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return ret%mod; } namespace lucas {LL A[maxn],inv[maxn];void init(){A[0]=1,A[1]=1;inv[1]=1;inv[0]=1;for(int i=2;i<maxn;i++){A[i]=A[i-1]*(LL)i%mod;inv[i]=Pow(A[i],mod-2);}}LL Lucas(LL a,LL b){if(a<b) return 0;if(a<mod&&b<mod) return (A[a]*inv[b]%mod)*inv[a-b]%mod;return Lucas(a/mod,b/mod)*Lucas(a%mod,b%mod)%mod;} } using namespace lucas;int main() {ios_base::sync_with_stdio(false);cin.tie(0);while(cin>>p[0].x>>p[0].y>>p[1].x>>p[1].y>>mod){if(p[0].y>p[0].x&&p[1].y>p[1].x&&p[0].y>p[1].x) {printf("0\n");continue;}init();sort(p,p+2);if(!(p[0].x<=p[1].x && p[0].y<=p[1].y)){int x1=p[0].x,y1=p[0].y,x2=p[1].x,y2=p[1].y;p[0].x=x1,p[0].y=y2,p[1].x=x2,p[1].y=y1;}LL sta=p[0].x,en=p[1].x,h=p[0].y,ans=0;while(h<=p[1].y && sta<=en ){if(sta<h) sta=h;ans=(ans+Lucas(en+1,h+1)-Lucas(sta,h+1)+mod)%mod;h++;}printf("%lld\n",ans);}return 0; } /**/ View Code

方法二:

/* * this code is made by crazyacking * Verdict: Accepted * Submission Date: 2015-05-21-02.58 * Time: 0MS * Memory: 137KB */ #include <queue> #include <cstdio> #include <set> #include <string> #include <stack> #include <cmath> #include <climits> #include <map> #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> #include <cstring> #define LL long long #define ULL unsigned long long using namespace std; struct cell {int x,y;bool operator<(cell c) const{return x==c.x?(y<c.y):(x<c.x);} }p[2]; LL mod; LL inv[101000],A[101000]; inline LL Pow(LL a,LL b) {LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return (ret-1)%mod; }void init() {A[0]=1,A[1]=1;inv[1]=1;inv[0]=1;for(int i=2;i<101000;i++){A[i]=A[i-1]*(LL)i%mod;inv[i]=Pow(A[i],mod-2);} } LL Lucas(LL a,LL b) {if(a<b) return 0;if(a<mod&&b<mod) return (A[a]*inv[b]%mod)*inv[a-b]%mod;return Lucas(a/mod,b/mod)*Lucas(a%mod,b%mod)%mod; }inline LL Pow(LL b) {b=b+1;if(b<0) return 0;LL a=2;LL ret=1;a%=mod;while(b){if(b&1) ret=ret*a%mod;a=a*a%mod;b>>=1;}return (ret-1)%mod; }inline int calc_Matrix(int x,int y) {if(x<0||y<0) return 0;if(x<=y)return Pow(x);else{LL sum1=Pow(y);LL tmp=Pow(y)-Pow(y-1);LL sum2=0;for(int i=y+1;i<=x;++i){tmp=tmp*2-(int)Lucas((LL)i-1,(LL)y);tmp%=mod;sum2+=tmp;sum2%=mod;}return (sum1+sum2)%mod;} } int main() {ios_base::sync_with_stdio(false);cin.tie(0);while(cin>>p[0].x>>p[0].y>>p[1].x>>p[1].y>>mod){if(p[0].y>p[0].x&&p[1].y>p[1].x&&p[0].y>p[1].x) {printf("0\n");continue;}init();sort(p,p+2);if(!(p[0].x<=p[1].x && p[0].y<=p[1].y)){int x1=p[0].x,y1=p[0].y,x2=p[1].x,y2=p[1].y;p[0].x=x1,p[0].y=y2,p[1].x=x2,p[1].y=y1;}cout<<(calc_Matrix(p[1].x,p[1].y)-calc_Matrix(p[0].x-1,p[1].y)-calc_Matrix(p[1].x,p[0].y-1)+calc_Matrix(p[0].x-1,p[0].y-1))%mod<<endl;}return 0; } /**/ View Code

?

總結(jié)

以上是生活随笔為你收集整理的组合数(Lucas定理) + 快速幂 --- HDU 5226 Tom and matrix的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲成人v| 久久精品2019中文字幕 | 国产精品久久国产精品 | 无码国模国产在线观看 | 森泽佳奈作品在线观看 | 成人久久一区 | 少妇又色又爽又黄的视频 | 日本在线播放 | 无码人妻一区二区三区在线 | 天堂中文在线观看视频 | 欧美视频在线观看一区二区三区 | 色咪咪网站 | 69国产精品视频 | 91精品国产91久久久久久久久久久久 | 亚洲网站免费 | 人妻色综合网站 | 五月天婷婷色 | 亚洲av中文无码乱人伦在线观看 | 成人午夜小视频 | 天天爱夜夜爱 | 熟女视频一区二区三区 | 综合在线观看 | 五月激情站 | 亚洲国产黄色片 | 日本精品视频一区 | 337p粉嫩大胆色噜噜噜 | 丝袜操| 精品盗摄一区二区三区 | 性做爰裸体按摩视频 | 日韩欧| 性福利视频 | 中文字幕免费在线视频 | 久久久久久久久久久久久久国产 | 中文在线观看视频 | 欧美熟妇精品久久久久久 | 欧美丰满一区二区免费视频 | 久久国产黄色片 | 兄弟兄弟全集免费观看 | 波多野结衣50连登视频 | 亚洲黄色录像 | 蜜桃av一区二区三区 | 午夜婷婷丁香 | 一区二区一级片 | 久久精品伊人 | 91嫩草精品| 日本成人在线播放 | 在线看av网址 | 精品欧美一区二区久久久久 | 无码一区二区波多野结衣播放搜索 | 欧美日韩成人在线播放 | 成人免费看av | 一本av在线 | 午夜精品久久久久久久久久久久久蜜桃 | 操处女逼视频 | 手机看片中文字幕 | 人妻熟女一区二区三区app下载 | 中文字幕国产精品 | 成人精品一区二区三区视频 | 欧美精品二区三区 | 日本电影一区二区三区 | 欧美成视频 | 精品一区二区三区四区 | 韩国精品一区二区三区 | 最近免费中文字幕中文高清百度 | 久久久久亚洲AV | 豆花视频成人 | 欧美一区二区大片 | 成人三级电影网站 | 国产中文字幕一区 | 国产一二三在线视频 | 少妇流白浆 | 亚洲色欲色欲www在线观看 | 欧美激情一区二区三级高清视频 | 露胸app| 欧美无砖区 | 伊人成人动漫 | 国产初高中真实精品视频 | 成人毛片观看 | 亚洲天堂手机版 | 免费看一区二区三区 | 亚洲欧美一级 | 岛国av电影在线观看 | 欧美三级成人 | 毛片网站在线观看 | 无码人妻精品一区二区三区99不卡 | 手机av在线网 | 精品人妻一区二区三区含羞草 | 午夜精品一区二 | 国精产品乱码一区一区三区四区 | 久草香蕉在线 | 欧美第四页 | 日本一本久 | 成人影院免费 | 少妇一边呻吟一边说使劲视频 | 日韩精品一区二区在线视频 | 国产精品一区二区欧美 | 极品尤物一区二区 | 香蕉视频免费在线 | 精品女同一区二区三区 |