传送门

博客园突然打不开了,奇奇怪怪的……

少写个等号没看出来 nm写反了没看出来 考完5min全拍出来了

手残属性加持 不对拍等于爆零

yysy,我连卢卡斯定理的存在都忘了……

发现要让一大堆皇后能互相攻击,它们貌似只能在同一条直线上

然后发现皇后数量较少的时候好像有特例

所以特判即可

\(O(n)\)解法需要枚举边长,考虑如何优化

枚举边长是省不掉的,考虑处理下柿子

\[\sum\limits_{i=1}^{min(n,m)-1}(n-i)(m-i) = \sum\limits_{i=1}^{min(n,m)-1}nm-(n+m)+i^2 = (min(n,m)-1)nm-(n+m)\sum\limits_{i=1}^{min(n,m)-1}i+\sum\limits_{i=1}^{min(n,m)-1}i^2
\]
  • 有个式子:\(\sum\limits_{i=1}^n i^2 = \frac{n(n+1)(2n+1)}{6}\)

    同理,[留坑]

然后还有一个需要处理的式子是 \(\sum\limits_{i=k}^n C_i^k\)

\[\sum\limits_{i=k}^n C_i^k = C_{k+1}^{k+1}+\sum\limits_{i=k+1}^n C_i^k = C_{k+1}^{k+1}+C_{k+1}^k+\sum\limits_{i=k+2}^n C_i^k
\]

发现这两项可以组合,即为

\[C_{k+1}^k + \sum\limits_{i=k+2}^n C_i^k
\]

依次组合,最终原式等于 \(C_{n+1}^{k+1}\)

  • 结论:\(\sum\limits_{i=0}^n C_i^k = C_{n+1}^{k+1}\)

Code:

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 310010
#define ll long long
#define int long long char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline ll read() {
ll ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} ll n, m, k, kn, km;
ll fac[N], inv1[N], inv2[N];
const ll p=3e5+7;
inline ll C(ll n, ll k) {return n>=k?fac[n]*inv2[k]%p*inv2[n-k]%p:0;}
inline ll lucas(ll n, ll k) {return !k?1:lucas(n/p, k/p)*C(n%p, k%p)%p;} namespace task1{
inline ll sig(ll n) {n%=p; return n*(n+1)*inv1[2]%p;}
inline ll sig2(ll n) {n%=p; return n*(n+1)%p*(n*2+1)%p*inv1[6]%p;}
void solve() {
ll ans=0, lim;
n=read(); m=read(); k=read();
kn=n%p; km=m%p;
if (k==1) {printf("%lld\n", (kn*km)%p); return ;}
if (k==3) {
lim=(min(n, m)-1)%p; ans+=4ll*(lim*kn%p*km%p - (kn+km)%p*sig(lim)%p + sig2(lim))%p, ans%=p;
lim=min((n-1)/2, m-1)%p; ans+=2ll*(lim*kn%p*km%p - (2ll*km+kn)%p*sig(lim)%p + 2ll*sig2(lim))%p, ans%=p;
lim=min(n-1, (m-1)/2)%p; ans+=2ll*(lim*kn%p*km%p - (2ll*kn+km)%p*sig(lim)%p + 2ll*sig2(lim))%p, ans%=p;
}
if (k==4) {
lim=min((n-1)/2, m-1)%p; ans+=2ll*(lim*kn%p*km%p - (2ll*km+kn)%p*sig(lim)%p + 2ll*sig2(lim))%p, ans%=p;
lim=min(n-1, (m-1)/2)%p; ans+=2ll*(lim*kn%p*km%p - (2ll*kn+km)%p*sig(lim)%p + 2ll*sig2(lim))%p, ans%=p;
lim=(min(n, m)-1)%p; ans+=(lim*kn%p*km%p - (kn+km)%p*sig(lim)%p + sig2(lim))%p, ans%=p;
lim=((min(n, m)-1)/2)%p; ans+=5ll*(lim*kn%p*km%p - 2ll*(kn+km)%p*sig(lim)%p + 4ll*sig2(lim))%p, ans%=p;
}
if (k==5) {lim=((min(n, m)-1)/2)%p; ans+=2ll*(lim*kn%p*km%p - 2ll*(kn+km)%p*sig(lim)%p + 4ll*sig2(lim))%p, ans%=p;}
if (m>=k) ans+=kn*lucas(m, k)%p, ans%=p;
if (n>=k) ans+=km*lucas(n, k)%p, ans%=p;
if (n>=k && m>=k) {
ans+=4ll*lucas(min(n, m), k+1)%p, ans%=p;
ans+=2ll*(max(n, m)-min(n, m)+1)%p*lucas(min(n, m), k)%p, ans%=p;
}
printf("%lld\n", (ans%p+p)%p);
}
} signed main()
{
int T; T=read();
fac[0]=fac[1]=1; inv1[0]=inv1[1]=1; inv2[0]=inv2[1]=1;
for (int i=2; i<N; ++i) fac[i]=fac[i-1]*i%p;
for (int i=2; i<N; ++i) inv1[i]=(p-p/i)*inv1[p%i]%p;
for (int i=2; i<N; ++i) inv2[i]=inv1[i]*inv2[i-1]%p;
while (T--) task1::solve(); return 0;
}

题解 queen(留坑)的更多相关文章

  1. Codeforces Round #364 (Div. 1)(vp) 没什么题解就留坑待填

    我就做了前两题,第一题第一次vp就把我搞自闭跑路了,第二题第二次又把我搞自闭了 A. As Fast As Possible 细节题 #include<cstdio> #include&l ...

  2. [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)

    A - ACM Computer Factory 题目描述:某个工厂可以利用P个部件做一台电脑,有N个加工用的机器,但是每一个机器需要特定的部分才能加工,给你P与N,然后是N行描述机器的最大同时加工数 ...

  3. 2.18比赛(T2,T3留坑)

    2.18比赛(T2,T3留坑) pdf版题面 pdf版题解 超越一切(ak) [题目描述] 夏洛可得到一个(h+1)×(w+1)的巧克力,这意味着她横着最多可 以切 h 刀,竖着最多可以切 w 刀 她 ...

  4. CPU虚拟化技术(留坑)

    留坑~~~ 不知道这个是这么实现的 CPU虚拟化技术就是单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率.虚 ...

  5. 【留坑】uva12299

    这么sb的题本来想练练手记过就是过不了 拍半天也没问题 留坑 哪天有空了去linux下面试试 #include<cstdio> #include<cstring> #inclu ...

  6. 【问题解决方案】Git bash进入多层子目录问题(通配符问题留坑)

    cd进入指定路径下:cd 斜杠 斜杠 方法一: 1- 撇丿,不是"那",盘符前面要加上 / (d盘前面也加,不加也行) 2- 路径名不区分大小写 3- 不用空格 4- 如果目录名中 ...

  7. 题解 Six(留坑)

    传送门 考场上搞了个三进制状压,结果正确性假了-- 有想到从约数下手,但觉得就光预处理约数复杂度就爆炸就没往这边想-- 首先是关于约数个数的证明,再一次感谢战神: 因为 \(n = \prod p_i ...

  8. 题解 c(留坑)

    传送门 这题卡常--而且目前还没有卡过去 首先以原树重心为根,向所有子树重心连边,可以建立一棵点分树 点分树有两个性质: 一个是树高只有log层 另一个是两点在点分树上的lca一定在原树上两点间的树上 ...

  9. 培训补坑(day7:线段树的区间修改与运用)(day6是测试,测试题解以后补坑QAQ)

    补坑咯~ 今天围绕的是一个神奇的数据结构:线段树.(感觉叫做区间树也挺科学的.) 线段树,顾名思义就是用来查找一段区间内的最大值,最小值,区间和等等元素. 那么这个线段树有什么优势呢? 比如我们要多次 ...

随机推荐

  1. 每日英语——the rest of my life

    <the rest of My life> 词面意思:我的余生 实际意思:我的余生 1.  歌曲:<The Rest of My life> Less Than Jake 歌词 ...

  2. WIN10 GMSSL编译

    从git上拉取GMSSL代码 从http://gmssl.org/上可以拉取,或者直接从git上https://github.com/guanzhi/GmSSL拉也行. 我是在git上下的,文件为gm ...

  3. 2018年成为Web开发者的路线图

    本文通过一组大图展示了Web开发技能图谱,给出了作为Web 开发者可以采取的路径,以及总结了想要成为Web工程师的朋友们.希望和大家一起交流分享 介绍 Web 开发的角色一般说来,包括前端.后端和de ...

  4. 论文阅读:LIC-Fusion: LiDAR-Inertial-Camera Odometry

    本文提出了一种紧耦合的多传感器(雷达-惯导-相机)融合算法,将IMU测量.稀疏视觉特征.提取的激光点融合.提出的算法在时间和空间上对三个异步传感器进行在线校准,补偿校准发生的变化.贡献在于将检测和追踪 ...

  5. Appearance-Based Loop Closure Detection for Online Large-Scale and Long-Term Operation

    Abstract: 本文提出一种用于大规模的长期回环检测,基于一种内存管理方法:限制用于回环检测的位置数目,以满足实时性要求. introduction: 大场景存在的最关键问题:随着场景增大,回环检 ...

  6. Day12 抽象类、接口、内部类-面向对象编程(3)

    抽象类 abstract修饰符可以用来修饰方法也可以用来修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类: 抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类. ...

  7. centos7下安装mycat中间件 笔记

    1. 下载 # wget http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-releas ...

  8. Servlet 单例多线程详解(六)

    一.Servlet 单例多线程 Servlet如何处理多个请求访问?Servlet容器默认是采用单实例多线程的方式处理多个请求的:1.当web服务器启动的时候(或客户端发送请求到服务器时),Servl ...

  9. 构建后端第2篇之---springb @ComponentScan注解使用

    张艳涛写于2021-2-8日 构建后端项目的时候遇到一个问题,在zyt-auth项目的依赖定义了@Component类,这个类在项目启动的时候提示没有找到bean Field tokenService ...

  10. OpenCV 之 特征检测

    特征,也称 兴趣点 或 关键点,如下:蓝框内区域平坦,无特征:黑框内有"边缘",红框内有"角点",后二者都可视为"特征" 角点作为一种特征, ...