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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ4403 序列统计—Lucas你好

發布時間:2024/1/17 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ4403 序列统计—Lucas你好 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  絕對是全網寫的最詳細的一篇題解(因為我弱)?

  題目:序列統計  代碼難度:簡單  思維難度:提高+—省選

  講下題面:給定三個正整數N、L和R,統計長度在1到N之間,元素大小都在L到R之間的單調不降序列的數量。輸出答案對10^6+3取模的結果。

  。。。    防

  。。。    蒯

  。。。    神

  。。。    器

  好了,把我的做題思路說說。

  首先我們可以看出,L和R的具體值是沒有卵用的,你只需要知道它們的差+1,記為m。同時T<=100也意味著各組詢問之間應該并沒有關系。

  然后我們會想到,這肯定不能一步出解(事實證明我被打臉了)。然后我們來找,對于條件(i,m),它的解是怎么來的。

  長度為i,備選數的值域(下面就叫做值數)有m個的單調不下降序列有多少個呢?

  這么一想不是很好想出來。那么我們想,如果把相同的數歸入一個集合,或者叫抽屜,給它們以里面的數的代數值為編號,這個序列就可以看成一段段連續的抽屜,且它們的編號成遞增。

  問題是不是可以抽象成:我有m個有編號的抽屜,要把i個相同的蘋果放進去,問有多少種方法?

  此時問題已經漸漸清晰成具體模型了,但對于有些人(such as me)來說還是很玄學。于是我們再看看。

  上面那個問題下,抽屜是不動物體。現在我們把蘋果當成不動物體看看:

  有i個蘋果,要把它們分成至多m個區間,有多少種方法?

  這個時候千萬不要想復雜了。對于這個問題,如果我們不局限于單個的i和m,而是把它們巧妙轉化,整合在一起的話——

  有i個蘋果,m-1個擋板。我們要在蘋果中間插入擋板(也可以是最兩側),有多少種方法?

  換言之——

  有m+i-1個位子,你要在里面放m-1個擋板,有多少種放法?

  那么就是顯然的組合數學!C(i+m-1,m-1)!

  那么我們知道(i,m)的答案就是C(i+m-1,m-1)。

  那么答案就是sigma(i from 1 to n)C(i+m-1,m-1);

  然而這是會T的復雜度。我們畫出楊輝三角(或者根本不用畫),就能發現它是在三角上的一條向左下傾斜的線。那么優化就順(sang)理(xin)成(bing)章(kuang)了:

  在右上角加一個C(m,m),根據楊輝三角的特點,我們可以一路消掉,一直到C(N+M,M);

  因為我們之前加上了C(M,M),所以答案要減一。Ans=C(N+M,M)-1;正面肛Lucas定理。

  介紹一下Lucas定理:C(N,M)%P=Lucas(N,M,P)=C(N%P,M%P)*Lucas(N/P,M/P,P);

  逆元和階乘預處理一下就好了。

  

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> #include <cstring> #include <queue> #define LL long long int #define ls (x << 1) #define rs (x << 1 | 1) #define MID int mid=(l+r)>>1 using namespace std; const LL Mod = 1000003; LL cmod[Mod],A[Mod],J[Mod],n,m; LL gi() {LL x=0,res=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')res*=-1;ch=getchar();}while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*res; } LL C(LL N,LL M,LL P) {if(M>N)return 0ll;LL ans=J[N];ans=ans*A[J[N-M]]%P;ans=ans*A[J[M]]%P;return ans; } LL Lucas(LL N,LL M,LL P) {if(M==0)return 1ll;if(N<P&&M<P)return C(N,M,P);LL c=C(N%P,M%P,P); if(!c)return 0ll;LL L=Lucas(N/P,M/P,P);return (c*L)%P; } int main() {int T=gi();J[0]=A[1]=J[1]=1;for(LL i=2;i<Mod;++i)A[i]=((Mod-Mod/i)*A[Mod%i])%Mod;for(LL i=2;i<Mod;++i)J[i]=(J[i-1]*i)%Mod;while(T--){n=gi();m=(gi()-gi());m=-m+1;printf("%lld\n",(Lucas(n+m,n,Mod)-1+Mod)%Mod);}return 0; }

?

轉載于:https://www.cnblogs.com/fenghaoran/p/6592128.html

總結

以上是生活随笔為你收集整理的BZOJ4403 序列统计—Lucas你好的全部內容,希望文章能夠幫你解決所遇到的問題。

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