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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

jzoj 6302. 提高组

發布時間:2023/12/2 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jzoj 6302. 提高组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

詳見OJ

Solution

對于\(limit1,2\)就是使序列\(1~n\)的排列。
對于\(limit3\),我們可以將其看做是兩個最長上升子序列正好覆蓋整個序列,證明顯然。
我們可以做一個前綴\(max\)序列。這樣對于\(max[i]\),保證\(max[i]>=i\)。
而且保證\(max[n]=n\)。
如此,我們可以將問題轉化成圖。
那么我們可以將問題變成:
求從\((1,1)\)\((x,y)\)再到\((n,n)\)的方案數,途中不能觸碰到\(y=x-1\)的直線(不能使\(max[i]<i\))。
對于觸碰到的方案數用題解說的翻折法即可。
預處理階乘和逆元\(O(n)\),詢問\(O(1)\)。時間可過。

Code

#include <cstdio> #define maxn 20000000 #define ll long long #define mo 1000000007 #define mem(x, a) memset(x, a, sizeof x) #define fo(x, a, b) for (int x = a; x <= b; x++) #define fd(x, a, b) for (int x = a; x >= b; x--) using namespace std; int T, n; ll x, y, jc[maxn + 10], ny[maxn + 10], ans = 0;inline int read() {int x = 0; char c = getchar();while (c < '0' || c > '9') c = getchar();while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();return x; }inline void swap(ll &x, ll &y) {ll t = x; x = y; y = t;}ll ksm(ll x, int y) {ll s = 1;while (y){if (y & 1) s = s * x % mo;x = x * x % mo; y >>= 1;}return s; }ll C(ll x, ll y) {return x > y ? 0 : jc[y] * ny[x] % mo * ny[y - x] % mo;}int main() {freopen("tg.in", "r", stdin);freopen("tg.out", "w", stdout);T = read();ny[0] = jc[0] = jc[1] = 1;fo(i, 2, maxn) jc[i] = jc[i - 1] * i % mo;ny[maxn] = ksm(jc[maxn], mo - 2);fd(i, maxn - 1, 1) ny[i] = ny[i + 1] * (i + 1) % mo;while (T--){n = read(), x = read() - 1, y = read() - 1;if (x > y) swap(x, y);ans = (C(x, x + y) - C(y + 1, x + y) + mo) % mo;x++, y++;ans = ans * ((C(n - x, n + n - x - y) - C(n - y - 1, n + n - x - y) + mo) % mo) % mo;printf("%lld\n", ans);}return 0; }

轉載于:https://www.cnblogs.com/jz929/p/11348921.html

總結

以上是生活随笔為你收集整理的jzoj 6302. 提高组的全部內容,希望文章能夠幫你解決所遇到的問題。

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