当前位置: 首页 > news >正文

CSP模拟58联测20 牵着她的手

题目大意

考虑所有 n n n m m m列的矩阵,矩阵中每个元素的值都在 1 1 1 k k k之间。对于这样的矩阵 A A A,按照下面规则构造序列 x 1 , x 2 , ⋯ , x n + m x_1,x_2,\cdots,x_{n+m} x1,x2,,xn+m

  • 对于 1 ≤ i ≤ n 1\leq i\leq n 1in x i x_i xi A A A中第 i i i行的最大值
  • 对于 1 ≤ i ≤ m 1\leq i\leq m 1im x n + i x_{n+i} xn+i A A A中第 i i i列的最大值

求能构造出多少种不同的序列。

输出答案模 1 0 9 + 7 10^9+7 109+7后的值。

T T T组数据。

1 ≤ T ≤ 1000 , ∑ n , ∑ m ≤ 1 0 5 , k ≤ 1 0 9 1\leq T\leq 1000,\sum n,\sum m\leq 10^5,k\leq 10^9 1T1000,n,m105,k109

时间限制 3000 m s 3000ms 3000ms,空间限制 512 M B 512MB 512MB


题解

首先,我们可以发现, x 1 x_1 x1 x n x_n xn的最大值要等于 x n + 1 x_{n+1} xn+1 x n + m x_{n+m} xn+m的最大值。

然而,当 x 1 x_1 x1 x n x_n xn的最大值和 x n + 1 x_{n+1} xn+1 x n + m x_{n+m} xn+m的最大值相等时,这个序列一定合法。

为什么呢?我们可以把最大值的列和最大值的行相交的位置填上最大值,在这一行的其他位置填上其他数来满足列的要求,在这一列的其他位置填上其他数来满足行的要求,并在其他位置填 1 1 1,即可构造出这个序列。

我们可以枚举最大值来计算答案。

a n s = ∑ i = 1 k [ i n − ( i − 1 ) n ] × [ i m − ( i − 1 ) m ] ans=\sum\limits_{i=1}^k[i^n-(i-1)^n]\times [i^m-(i-1)^m] ans=i=1k[in(i1)n]×[im(i1)m]

这样做是 O ( k log ⁡ n ) O(k\log n) O(klogn)的,我们考虑优化。

我们可以发现,这是一个关于 k k k n + m n+m n+m次多项式,那么整个和式就是一个关于 k k k n + m + 1 n+m+1 n+m+1次多项式。那么,我们计算出前 n + m + 2 n+m+2 n+m+2项之后,用拉格朗日差值法,就可以优化到 O ( n 2 ) O(n^2) O(n2)

因为差值的时候, i i i的取值是连续的,那么差值的式子为

f ( x ) = ∑ i = 1 N y i ∏ j = 1 , j ≠ i N x − j i − j = ∑ i = 1 N y i × ∏ j = 1 , j ≠ i N x − j ∏ j = 1 , j ≠ i N i − j f(x)=\sum\limits_{i=1}^Ny_i\prod\limits_{j=1,j\neq i}^N\dfrac{x-j}{i-j}=\sum\limits_{i=1}^Ny_i\times \dfrac{\prod\limits_{j=1,j\neq i}^Nx-j}{\prod\limits_{j=1,j\neq i}^Ni-j} f(x)=i=1Nyij=1,j=iNijxj=i=1Nyi×j=1,j=iNijj=1,j=iNxj

其中 N = n + m + 2 N=n+m+2 N=n+m+2

对后面的式子,我们考虑如何快速来求。

∏ j = 1 , j ≠ i N i − j = ( ∏ j = 1 i − 1 i − j ) × ( ∏ j = i + 1 N i − j ) = ( i − 1 ) ! × ( N − i ) ! × ( − 1 ) N − i \prod\limits_{j=1,j\neq i}^Ni-j=(\prod_{j=1}^{i-1}i-j)\times (\prod\limits_{j=i+1}^Ni-j)=(i-1)!\times (N-i)!\times (-1)^{N-i} j=1,j=iNij=(j=1i1ij)×(j=i+1Nij)=(i1)!×(Ni)!×(1)Ni

预处理出每个数的阶乘,这部分就可以 O ( 1 ) O(1) O(1)求出。

x > N x>N x>N时, ∏ j = 1 , j ≠ i N x − j = ( ∏ j = 1 N x − j ) × 1 x − i \prod\limits_{j=1,j\neq i}^Nx-j=(\prod\limits_{j=1}^Nx-j)\times \dfrac{1}{x-i} j=1,j=iNxj=(j=1Nxj)×xi1,其中 ∏ j = 1 N x − j \prod\limits_{j=1}^Nx-j j=1Nxj可以在插值之前 O ( n ) O(n) O(n)求出, 1 x − i \dfrac{1}{x-i} xi1可以用逆元来求。

x ≤ N x\leq N xN时,我们一开始已经计算出来了,这部分可以直接输出。

那么,分子就可以 O ( log ⁡ n ) O(\log n) O(logn)求出。

这样,我们就可以把拉格朗日插值的时间复杂度降到 O ( n log ⁡ n ) O(n\log n) O(nlogn)

总时间复杂度为 O ( ∑ n log ⁡ n ) O(\sum n\log n) O(nlogn)

code

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
const long long mod=1e9+7;
int T;
long long n,m,k;
long long ans,x[N+5],y[N+5],jc[N+5];
long long mi(long long t,long long v){if(!v) return 1;long long re=mi(t,v/2);re=re*re%mod;if(v&1) re=re*t%mod;return re;
}
void init(){jc[0]=1;for(int i=1;i<=N;i++) jc[i]=jc[i-1]*i%mod;
}
long long gt(long long vx){long long re=0,wt=1;for(int i=1;i<=n+m+2;i++){wt=wt*((vx-x[i]+mod)%mod)%mod;}for(int i=1;i<=n+m+2;i++){long long p,q;p=y[i]*wt%mod*mi((vx-x[i]+mod)%mod,mod-2)%mod;if(n+m+2-i&1) q=(mod-jc[i-1]*jc[n+m+2-i]%mod)%mod;else q=jc[i-1]*jc[n+m+2-i]%mod;re=(re+p*mi(q,mod-2)%mod)%mod;}return re;
}
int main()
{init();scanf("%d",&T);while(T--){scanf("%lld%lld%lld",&n,&m,&k);ans=0;for(int i=1;i<=n+m+2;i++){x[i]=i;y[i]=(y[i-1]+(mi(i,n)-mi(i-1,n))*(mi(i,m)-mi(i-1,m))%mod+mod)%mod;}if(k<=n+m+2) printf("%lld\n",y[k]);else printf("%lld\n",gt(k));}return 0;
}
http://www.lryc.cn/news/197696.html

相关文章:

  • 电脑版便签软件下载用哪个?
  • 别再卷组件库了,Vue 拖拽库都断代了!
  • 利用服务器打造创新的在线社区
  • CSS动画实现节流
  • Apache Log4j Server (CVE-2017-5645) 反序列化命令执行漏洞
  • 视口 css
  • Puppeteer记录操作过程及优秀的开源插件(五)
  • 联邦学习+梯度+梯度剪枝
  • 提高研发效率还得看Apipost
  • Elasticsearch使用——结合MybatisPlus使用ES es和MySQL数据一致性 结合RabbitMQ实现解耦
  • 什么是CSGO大行动,2023年CSGO大行动时间预测
  • Pycharm中终端不显示虚拟环境名解决方法
  • 某翻译网站webpack 全扣js逆向法
  • 【C++】C++11 ——— 可变参数模板
  • ros2 UR10仿真包运行
  • flutter开发实战-安卓apk安装、卸载、启动实现
  • AI绘画使用Stable Diffusion(SDXL)绘制玉雕风格的龙
  • 上位机在自动化中有何作用和优势?
  • centos7 部署oracle完整教程(命令行)
  • 数据库常用的几大范式NF
  • 诈骗分子投递“大闸蟹礼品卡”,快递公司如何使用技术手段提前安全预警?
  • 基于晶体结构优化的BP神经网络(分类应用) - 附代码
  • 模型的选择与调优(网格搜索与交叉验证)
  • 2023-10-17 mysql-配置主从-记录
  • 正向代理与反向代理
  • idea热加载,JRebel 插件是目前最好用的热加载插件,它支持 IDEA Ultimate 旗舰版、Community 社区版
  • 0基础学习PyFlink——Map和Reduce函数处理单词统计
  • 在 Ubuntu 22.04安装配置 Ansible
  • 【大数据 - Doris 实践】数据表的基本使用(三):数据模型
  • PMP和CSPM证书,怎么选?