首页 技术 正文
技术 2022年11月15日
0 收藏 308 点赞 3,450 浏览 2512 个字

传送门

题意:给出长度为$N$的两个正整数序列$A_i,B_i$,求$\sum\limits_{i=1}^N \sum\limits_{j=i+1}^N C_{A_i+A_j+B_i+B_j}^{A_i+B_i}$。$N \leq 2 \times 10^5$


给出两种数据范围以及对应做法:

①$1 \leq A_i,B_i \leq 2000$(原题数据范围)

我们可以发现$C_{A_i+A_j+B_i+B_j}^{A_i+B_i}$就相当于在平面直角坐标系上限定每一次只能向上或者向右走一个单位的情况下,从$(-A_i,-B_i)$走到$(A_j,B_j)$的方案数量,所以原来的题目就可以抽象为一些第三象限的点限定每一次只能向上或者向右走一个单位的情况下走到第一象限中的任意一个点的方案数的和。我们可以将所有$(-A_i,-B_i)$的权值设为$1$,然后递推得到每一个$(A_j,B_j)$的方案数即可。注意:要将$(-A_i,B_i)$到$(A_i,B_i)$的路径方案数减掉(直接组合数即可),同时因为一个数对会被算两边,所以最后要乘上$2$的逆元。总时间复杂度为$O(N+\text{值域}^2)$

 #include<bits/stdc++.h> using namespace std; inline int read(){     ;     ;     char c = getchar();     while(c != EOF && !isdigit(c)){         if(c == '-')             f = ;         c = getchar();     }     while(c != EOF && isdigit(c)){         a = (a << ) + (a << ) + (c ^ ');         c = getchar();     }     return f ? -a : a; }  , MAXN =  , MAXM = ; ][MAXN + ] , jc[MAXN +  << ] = { , } , ny[MAXN +  << ] = {} , a[MAXM + ] , b[MAXM + ]; inline long long poww(long long a , int b){     ;     while(b){         )             times = times * a % MOD;         a = a * a % MOD;         b >>= ;     }     return times; } int main(){      ; i <= MAXN <<  ; i++)         jc[i] = jc[i - ] * i % MOD;     ny[MAXN << ] = poww(jc[MAXN << ] , MOD - );     ) -  ; i ; i--)         ny[i] = ny[i + ] * (i + ) % MOD;     ;      ; i <= N ; i++){         a[i] = read();         b[i] = read();         f[-a[i] + ][-b[i] + ]++;         ans = (ans + MOD - jc[a[i] + b[i] << ] * (] % MOD * ny[b[i] << ] % MOD) % MOD;     }      ; i <= MAXN ; i++){         f[i][] += f[i - ][];         f[][i] += f[][i - ];     }      ; i <= MAXN ; i++)          ; j <= MAXN ; j++)             f[i][j] = ((f[i][j] + f[i - ][j]) % MOD + f[i][j - ]) % MOD;      ; i <= N ; i++)         ans = (ans + f[a[i] + ][b[i] + ]) % MOD;     cout << ans * poww( , MOD - ) % MOD;     ; }

②$1 \leq A_i,B_i \leq 10^6 , \sum(A_i + B_i) \leq 2 \times 10^7$

注意到后面给的和的条件,思考如何去利用它。

将$C_{A_i+A_j+B_i+B_j}^{A_i+B_i}$稍微变形:

$C_{A_i+A_j+B_i+B_j}^{A_i+B_i}$

$= \sum\limits_{k=0}^{A_i+A_j} C_{A_i+B_i}^k \times C_{A_j+B_j}^{A_i+A_j-k}$

$= \sum\limits_{k=-A_i}^{A_j} C_{A_i+B_i}^{A_i+k} \times C_{A_j+B_j}^{A_j-k}$

$= \sum\limits_{k=-A_i}^{B_i} C_{A_i+B_i}^{A_i+k} \times C_{A_j+B_j}^{A_j-k}$

(至于最后一步,因为$k>B_i$时,$C_{A_i+B_i}^{A_i+k}=0$,而$k>A_j$时$C_{A_j+B_j}^{A_j-k}=0$,所以$A_j$与$B_i$是等价的)

所以我们维护$f_i$表示在计算$now$的答案时$\sum\limits_{j=1}^{now-1}C_{A_j+B_j}^{A_j-i}$的值,然后每一次通过$f$数组得到当前答案,并用当前的状态更新$f$数组即可。

复杂度$O(\sum(A_i + B_i) + N)$

 #include<bits/stdc++.h> using namespace std; inline int read(){     ;     ;     char c = getchar();     while(c != EOF && !isdigit(c)){         if(c == '-')             f = ;         c = getchar();     }     while(c != EOF && isdigit(c)){         a = (a << ) + (a << ) + (c ^ ');         c = getchar();     }     return f ? -a : a; }  , MAXN = ;  << ] , jc[MAXN + ] = { , } , ny[MAXN + ] = {}; inline long long poww(long long a , int b){     ;     while(b){         )             times = times * a % MOD;         a = a * a % MOD;         b >>= ;     }     return times; } int main(){      ; i <= MAXN ; i++)         jc[i] = jc[i - ] * i % MOD;     ny[MAXN] = poww(jc[MAXN] , MOD - );      ; i ; i--)         ny[i] = ny[i + ] * (i + ) % MOD;     ;      ; i <= N ; i++){         long long a = read() , b = read();         for(int j = -a ; j <= b ; j++)             ans = (ans + f[MAXN + j] * (long long)jc[a + b] % MOD * ny[a + j] % MOD * ny[b - j]) % MOD;         for(int j = -b ; j <= a ; j++)             f[MAXN + j] = (f[MAXN + j] + (long long)jc[a + b] * ny[a - j] % MOD * ny[b + j]) % MOD;     }     cout << ans % MOD;     ; }
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,994
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,507
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,350
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,135
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,768
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,845