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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Loj #6077. 「2017 山东一轮集训 Day7」逆序对

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Loj #6077. 「2017 山东一轮集训 Day7」逆序对 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Loj #6077. 「2017 山東一輪集訓 Day7」逆序對

Solution

fi,jf_{i,j}fi,j?表示前iii個數產生jjj個逆序對的方案數,每次考慮把i+1i+1i+1加入,有i+1i+1i+1個插入位置分別產生0..i0..i0..i個新的逆序對。

因此fnf_{n}fn?的生成函數為(1+x)(1+x+x2)…(1+x+…xn?1)(1+x)(1+x+x^2)\dots (1+x+\dots x^{n-1})(1+x)(1+x+x2)(1+x+xn?1)
fn=(1?x)(1?x2)…(1?xn)(1?x)nf_n=\frac{(1-x)(1-x^2)\dots (1-x^n)}{(1-x)^n}fn?=(1?x)n(1?x)(1?x2)(1?xn)?

1(1?x)n\frac{1}{(1-x)^n}(1?x)n1?的冪級數為∑i(n+i?1i)\sum_{i}\binom{n+i-1}{i}i?(in+i?1?),于是只需要考慮分子的系數。

我們只需要求出x0…xkx^0\dots x^kx0xk的系數,因此我們至多會選擇O(k)O(\sqrt k)O(k?)?xi-x^i?xi,于是考慮dpdpdp,令fi,jf_{i,j}fi,j?表示iii個數總和為jjj,最大數不超過nnn的方案數,每次可以整體加111或者添加一個"1""1""1"之后再加111,有:
fi,j=fi,j?i+fi?1,j?1?fi?1,j?n?1f_{i,j}=f_{i,j-i}+f_{i-1,j-1}-f_{i-1,j-n-1}fi,j?=fi,j?i?+fi?1,j?1??fi?1,j?n?1?

這里的?fi?1,j?n?1-f_{i-1,j-n-1}?fi?1,j?n?1?是因為這些數可能會超過nnn,因此我們要把超過nnn的去掉,也就是需要去掉存在n+1n+1n+1的不合法方案。

到這里就可以合并兩個冪級數求出答案了,注意原式中是?xi-x^i?xi,因此系數要乘上一個(?1)i(-1)^i(?1)i

時間復雜度O(kk)O(k\sqrt k)O(kk?)

Code

#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <cctype> #include <string> #include <cstring> #include <ctime> #include <cassert> #include <string.h> //#include <unordered_set> //#include <unordered_map> //#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B) #define PB(A) push_back(A) #define SIZE(A) ((int)A.size()) #define LEN(A) ((int)A.length()) #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define fi first #define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; } template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll; typedef unsigned long long ull; typedef long double lod; typedef pair<int,int> PR; typedef vector<int> VI;const lod eps=1e-11; const lod pi=acos(-1); const int oo=1<<30; const ll loo=1ll<<62; const int mods=1e9+7; const int MAXN=200005; const int INF=0x3f3f3f3f;//1061109567 /*--------------------------------------------------------------------*/ inline int read() {int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } int fac[MAXN],inv[MAXN],g[505][MAXN]; int upd(int x,int y) { return x+y>=mods?x+y-mods:x+y; } int quick_pow(int x,int y) {int ret=1;for (;y;y>>=1){if (y&1) ret=1ll*ret*x%mods;x=1ll*x*x%mods;}return ret; } int C(int x,int y) { return 1ll*fac[x]*inv[y]%mods*inv[x-y]%mods; } void Init(int n) {fac[0]=1;for (int i=1;i<=n;i++) fac[i]=1ll*fac[i-1]*i%mods;inv[n]=quick_pow(fac[n],mods-2);for (int i=n-1;i>=0;i--) inv[i]=1ll*inv[i+1]*(i+1)%mods; } signed main() {int n=read(),k=read(),sz=sqrt(k*2)+10; Init(n+k);g[0][0]=1;for (int i=1;i<=sz;i++)for (int j=i;j<=k;j++) g[i][j]=upd(upd(g[i][j-i],g[i-1][j-i]),mods-(j>=n+1?g[i-1][j-n-1]:0));int ans=0;for (int i=0;i<=sz;i++) for (int j=0;j<=k;j++) if (i&1) ans=upd(ans,mods-1ll*C(n+j-1,j)*g[i][k-j]%mods);else ans=upd(ans,1ll*C(n+j-1,j)*g[i][k-j]%mods);printf("%d\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的Loj #6077. 「2017 山东一轮集训 Day7」逆序对的全部內容,希望文章能夠幫你解決所遇到的問題。

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