传送门

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

少写个等号没看出来 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. HAl库控制L298N直流电机旋转笔记

    主函数开始后的处理流程: 1..所有外设初始化:HAL_Init() 2.系统时钟配置 RCC振荡器初始化:HAL_RCC_OsConfig() RCC时钟初始化:HAL_RCC_ClockConfi ...

  2. QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置

    引言 24岁的某天,承载着周围人的关心,一路南下.天晴心静,听着斑马,不免对未来有些彷徨.但是呢,人生总要走陌生的路,看陌生的风景,所幸可以听着不变的歌,关心自己的人就那么多.就像是对庸常生活的一次越 ...

  3. idea本地调式tomcat源码

    前言 上篇文章中一直没搞定的tomcat源码调试终于搞明白了,p神的代码审计星球里竟然有,真的好b( ̄▽ ̄)d ,写一下过程,还有p神没提到的小坑 准备阶段 1.去官网下东西:https://tomc ...

  4. 自动化测试 如何快速提取Json数据

    Json作为一种轻量级的交换数据形式,由于其自身的一些优良特性比如包含有效信息多,易于阅读和解析. 使用Json的场景也很多,比如读取解析系列化的Json格式的数据,我们需要将一个Json的字符串解析 ...

  5. [NOIp2017]宝藏 题解

    非常巧妙的 \(O(n^23^n)\) 做法. 题目的本质是要求一棵生成树,使得其每条边的长度与这条边的起点深度乘积的和最小. 我们使用状压 DP,考虑到当前状态与已经打通的点和深度有关,不妨设 \( ...

  6. 为什么每次下载后必须关闭掉IO流(十五)

    读一个文件,忘记关闭了流,你在操作系统里对这个文件的写,删除等操作就会报错,告诉你这个文件被某个进程占用,这是为什么呢? java是从c++设计来的,但是无论是C语言还是C++,都需要手动释放内存,j ...

  7. 跳转页面携带数据方法 js

    跳转页面 代码 function returnParent() { var arrReturn = new Array(); var tSel = LAAccountsGrid.getSelNo(); ...

  8. 只是想虐下春丽,一不当心玩了下serverless...感觉还不错哟!

    事情是这样的-- 前天下午天太热,我在家看电视,换台突然就看到了正在播<西游记>,窗外蝉声特别响,我一下就有种穿越回小学暑假的感觉.当时,我就特别想把我那台小霸王翻出来,玩两盘街霸--虐一 ...

  9. 文件包含 & LFI-labs靶场

    文件包含漏洞学习 冲冲冲,好好学习 2020.1.30 认真对待自己做出的每一个决定 知识与实践 Q:什么是文件包含? A:简单一句话,为了更好地使用代码的重用性,引入了文件包含函数,可以通过文件包含 ...

  10. Docker介绍及安装详解

    1:Docker简介 Docker 是一种运行于 Linux 和 Windows 上的软件,用于创建.管理和编排容器.Docker 是在 GitHub 上开发的 Moby 开源项目的一部分.Docke ...