NOIP 模拟 $25\; \rm queen$
题解 \(by\;zj\varphi\)
这是一道纯分类讨论,然后推式子的题,细节挺多,挺麻烦,但是很考验数学能力
不讲了,官方题解给的很清楚
Code:
%: pragma GCC optimize("O9")
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf,OPUT[100];
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(!isdigit(ch)) {if (ch=='-') f=0;ch=gc();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
template<typename T>inline void print(T x,char t) {
if (x<0) putchar('-'),x=-x;
if (!x) return putchar('0'),(void)putchar(t);
ri cnt(0);
while(x) OPUT[p(cnt)]=x%10,x/=10;
for (ri i(cnt);i;--i) putchar(OPUT[i]^48);
return (void)putchar(t);
}
}
using IO::read;using IO::print;
namespace nanfeng{
#define FI FILE *IN
#define FO FILE *OUT
#define int long long
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int MOD=3e5+7;
int frac[MOD+7],inv[MOD+7],n,m,k,T,ans,bs1,bs2;
inline int fpow(int x,int y) {
int res(1);
while(y) {
if (y&1) res=res*x%MOD;
x=x*x%MOD;
y>>=1;
}
return res;
}
inline void init() {
bs1=fpow(2,MOD-2),bs2=fpow(3,MOD-2);
frac[1]=1;
for (ri i(2);i<=MOD-1;p(i)) frac[i]=frac[i-1]*i%MOD;
inv[MOD-1]=fpow(frac[MOD-1],MOD-2);
for (ri i(MOD-2);i;--i) inv[i]=inv[i+1]*(i+1)%MOD;
}
inline int C(int n,int m) {
if (n<m) return 0;
if (n==m||!m) return 1;
return frac[n]*inv[n-m]%MOD*inv[m]%MOD;
}
int lucas(int n,int m) {
if (n<m) return 0;
if (n==m||!m) return 1;
return C(n%MOD,m%MOD)*lucas(n/MOD,m/MOD)%MOD;
}
inline int MD(int &x) {return x=x>=MOD?x-MOD:x;}
inline int solve0() {
int tmp1=(lucas(n,k)*(m%MOD)%MOD+lucas(m,k)*(n%MOD)%MOD)%MOD;
int tmp2=(2*lucas(m+1,k+1)+2*lucas(m,k)*((n-m)%MOD)%MOD+2*lucas(m,k+1)%MOD)%MOD;
return (tmp1+tmp2)>=MOD?(tmp1+tmp2)-MOD:tmp1+tmp2;
}
inline int calc1(int x) {return bs2*x*(x+1)%MOD*(x+bs1)%MOD;}
inline int calc2(int x) {return (x*(x+1)>>1ll)%MOD;}
inline int solve1() {return (n%MOD)*(m%MOD)%MOD;}
inline int solve3() {
int x=(cmin(n+1,(m+2)>>1)-1)%MOD;
int y=(cmin(m+1,(n+2)>>1)-1)%MOD;
n%=MOD,m%=MOD;
int tmp1=2*(n*m*(x+y)%MOD+2*(calc1(x)+calc1(y))%MOD-(2*n+m)*calc2(x)%MOD-(2*m+n)*calc2(y)%MOD+MOD)%MOD;
int tmp2=4*(n*m%MOD*(m-1)%MOD+calc1(m-1)-(n+m)*calc2(m-1)%MOD+MOD)%MOD;
return (tmp1+tmp2+MOD)%MOD;
}
inline int solve4() {
int x=(cmin(n+1,(m+2)>>1)-1)%MOD;
int y=(cmin(m+1,(n+2)>>1)-1)%MOD;
int z=(m>>1)%MOD;
n%=MOD,m%=MOD;
int tmp1=2*(n*m%MOD*(x+y)%MOD+2*(calc1(x)+calc1(y))%MOD-(2*n+m)*calc2(x)%MOD-(2*m+n)*calc2(y)%MOD+MOD)%MOD;
int tmp2=(n*m%MOD*(m-1)%MOD+calc1(m-1)-(n+m)*calc2(m-1)%MOD+MOD)%MOD;
int tmp3=5*(n*m*z%MOD-2*(n+m)*calc2(z)%MOD+4*calc1(z)+MOD)%MOD;
return (tmp1+tmp2+tmp3+MOD)%MOD;
}
inline int solve5() {
int x=(m-1>>1)%MOD;
n%=MOD,m%=MOD;
int tmp=(2*n*m*x%MOD+8*calc1(x)%MOD-4*(n+m)*calc2(x)%MOD+MOD)%MOD;
return tmp;
}
inline int main() {
//FI=freopen("nanfeng.in","r",stdin);
//FO=freopen("nanfeng.out","w",stdout);
init();
read(T);
for (ri z(1);z<=T;p(z)) {
ans=0;
read(n),read(m),read(k);
if (n<m) swap(n,m);
if (k>1) ans=solve0();
switch(k) {
case 1:ans=solve1(),MD(ans);break;
case 3:ans+=solve3(),MD(ans);break;
case 4:ans+=solve4(),MD(ans);break;
case 5:ans+=solve5(),MD(ans);break;
default:break;
}
print(ans,'\n');
}
return 0;
}
#undef int
}
int main() {return nanfeng::main();}
NOIP 模拟 $25\; \rm queen$的更多相关文章
- NOIP 模拟 $25\; \rm random$
题解 \(by\;zj\varphi\) 期望好题. 通过推规律可以发现每个逆序对的贡献都是 \(1\),那么在所有排列中有多少逆序对,贡献就是多少. \[\rm num_i=(i-1)!\sum_{ ...
- NOIP 模拟 $25\; \rm string$
题解 \(by\;zj\varphi\) 考虑对于母串的每个字符,它在匹配串中有多少前缀,多少后缀. 设 \(f_i\) 表示 \(i\) 位置匹配上的前缀,\(g_i\) 为后缀,那么答案为 \(\ ...
- 7.25 NOIP模拟8
这次考试前面状态还行,后两个小时真是一言难尽,打了个T3的n^2暴力就懵逼了,不知道怎么优化. T1.匹配 看了一边题发现不太懂(这不是考试的难度啊),然后水完T2后回来5分钟水过,非常愉快的一道题. ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- 2021.5.22 noip模拟1
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
- NOIP 模拟 $30\; \rm 毛一琛$
题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...
- NOIP模拟3
期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...
- 7.22 NOIP模拟7
又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...
- NOIP模拟 9
%liu_runda Orz T1 随 矩阵快速幂结合概率期望 但n3无法承受 利用原根的性质,将乘法转化成加法 就变成循环矩阵n^2了 改题时苦b地卡了关:误把1当成原根的1次方,错误地认为矩阵的阶 ...
随机推荐
- 新旧图号(图幅号)转换/计算/检查,经纬度转换计算,C#代码
图号(图幅号):地图图号是指为便于使用和管理,按照一定方法将各分幅地图进行的编号. 经常用到图号,但是在网上一直没有找到一个完整的图号转换程序,因此自己写了一个图号处理的库,分享出来.如有错误请指正. ...
- 盘点linux操作系统中的10条性能调优命令,一文搞懂Linux系统调优
原文链接:猛戳这里 性能调优一直是运维工程师最重要的工作之一,如果您所在的生产环境中遇到了系统响应速度慢,硬盘IO吞吐量异常,数据处理速度低于预期值的情况,又或者如CPU.内存.硬盘.网络等系统资源长 ...
- Codeforces Round #139 (Div. 2) 题解
vp上古场次ing CF225A Dice Tower 1.题目简述: 有 \(n\) 个骰子被叠在了一起.对于每个骰子上的一个数,与它对面的数的和始终为 \(7\) . 你是小明,你只能从正面看这个 ...
- c语言:逗号运算符
#include <stdio.h> main() { int a,s,d; s=2,d=3; a=12+(s+2,d+4); printf("%d\n",a); in ...
- C语言:清空缓冲区
缓冲区的优点很明显,它加快了程序的运行速度,减少了硬件的读写次数,让整个计算机变得流畅起来:但是,缓冲区也带来了一些负面影响,经过前面几节的学习相信读者也见识到了.那么,该如何消除这些负面影响呢?思路 ...
- commons-collections利用链学习总结
目录 1 基础 ConstantTransformer InvokeTransformer ChainedTransformer LazyMap TiedMapEntry TransformingCo ...
- Java之注解与反射
Java之注解与反射 注解(Annotation)简介 注解(Annotation)是从JDK5.0引入的新技术 Annotation作用:注解(Annotation)可以被其他程序如编译器等读取 A ...
- springMVC-5-视图解析器
视图和视图解析器工作流程 第一步:获取到ModelAndView对象 请求处理方法执行完成后,无论返回是String,View 还是 ModeMap 类型,Spring MVC 也会在内部将它们装配成 ...
- POJ1456 Supermarket 题解
思维题. 关键在于如何想到用堆来维护贪心的策略. 首先肯定是卖出的利润越大的越好,但有可能当前这天选定了利润最大的很久才过期而利润第二大的第二天就过期,这时的策略就不优了. 所以我们必须动态改变策略, ...
- 选择排序(selection_sort)——Python实现
# 选择排序 # 作用:对给出的n个顺序不定的数进行排序 # 输入:任意数组A # 输出:按顺序排列的数组A # 时间复杂度 (n(n-1))/2 # 选择排序 # 第一趟:选择第一个元素,依次与 ...