清北学堂模拟赛d4t6 c
分析:这道题比较有难度.
观察题目,发现只有当一行翻了奇数次后才会产生黑色格子,设有x行被翻了奇数次,y列被翻了偶数次,那么x*m + y*n - 2*x*y = s,接下来就要解方程了.对于二元一次方程,先枚举其中一个未知数x,就能推得y = (s - x*m)/(n - 2*x).假设翻了奇数次的x行y列各只用x,y次操作,那么接下来的任务就是把剩下的没用完的次数给分配出去,而且不能改变奇偶性.如果每一次操作是把一行或一列翻两次,那么就是要把(r - x)/2次操作分给n行,(c - y)/2次操作分给m列,这个的方案数可以用隔板法来求解,即:
C((r - x) / 2 + n - 1,n - 1),C((c - y) / 2 + m - 1,m - 1),n行m列中选x行y列的方案数为C(n,x),
C(m,y),那么答案就是C((r - x) / 2 + n - 1,n - 1)*C((c - y) / 2 + m - 1,m - 1)*C(n,x)*C(m,y).
统计方案数的时候要看y是不是整数,并且r-x和c-y要能被2整除.最后要特判一种情况:x*2=n,在这种情况下,无论多少列被染了奇数次黑色格子永远是那么多,把所有列的情况算一次就好了.
以后取模运算要单独开一个函数写,这样不容易错.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> const int mod = 1e9 + , maxn = ; using namespace std;
long long p[maxn];
int n, m, r, c;
long long s, v1[maxn], v2[maxn], v3[maxn], v4[maxn], ans; long long mul(long long a, long long b)
{
a *= b;
if (a >= mod)
a %= mod;
return a;
} void inc(long long &a, long long b)
{
a += b;
if (a >= mod)
a -= mod;
} long long qpow(long long a, long long b)
{
long long res = ;
while (b)
{
if (b & )
res = mul(res, a);
b >>= ;
a = mul(a, a);
}
return res;
} int main()
{
scanf("%d%d%d%d%lld", &n, &m, &r, &c, &s); p[] = ;
for (int i = ; i <= ; i++) //逆元
p[i] = ((mod - mod / i) * p[mod % i]) % mod; long long temp = ;
for (int i = ; i <= r; i++) //求C(n + i - 1,n - 1)
{
v1[i] = temp;
temp = mul(temp, mul(i + n, p[i + ]));
}
temp = ;
for (int i = ; i <= c; i++)
{
v2[i] = temp;
temp = mul(temp, mul(i + m, p[i + ]));
}
temp = ;
for (int i = ; i <= n; i++)
{
v3[i] = temp;
temp = mul(temp, mul(n - i, p[i + ]));
}
temp = ;
for (int i = ; i <= m; i++)
{
v4[i] = temp;
temp = mul(temp, mul(m - i, p[i + ]));
}
for (long long i = r & ; i <= min(n, r); i += )
{ if (i * != n)
{
if (((s - (long long)m * i)) % (n - i * ))
continue;
long long b = (s - (long long)i * m) / (n - i * );
if (b > c || b < || (c - b) & )
continue;
long long temp = v3[i];
temp = mul(temp, v1[(r - i) >> ]);
temp = mul(temp, v4[b]);
temp = mul(temp, v2[(c - b) >> ]);
inc(ans, temp);
}
else
{
if ((long long)i * m != s)
continue;
long long temp = v3[i];
temp = mul(temp, v1[(r - i) >> ]);
long long cnt = ;
for (int b = (c & ); b <= min(r, c); b += )
inc(cnt, mul(v4[b], v2[(c - b) >> ]));
inc(ans, mul(temp, cnt));
}
}
printf("%lld\n", ans); return ;
}
清北学堂模拟赛d4t6 c的更多相关文章
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟赛d6t6 棋盘迷宫
3.棋盘迷宫(boardgame.pas/c/cpp)(boardgame.in/out)时间限制:5s/空间限制:256M[题目描述]小 A 和小 Z 是非常要好的朋友, 而且他们都对迷宫游戏非常有 ...
- 清北学堂模拟赛d1t2 火柴棒 (stick)
题目描述众所周知的是,火柴棒可以拼成各种各样的数字.具体可以看下图: 通过2根火柴棒可以拼出数字“1”,通过5根火柴棒可以拼出数字“2”,以此类推. 现在LYK拥有k根火柴棒,它想将这k根火柴棒恰好用 ...
- 清北学堂模拟赛d1t1 位运算1(bit)
题目描述LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值.假设数字N的价值是K,LYK想找到一个 ...
- 清北学堂模拟赛d2t6 分糖果(candy)
题目描述总共有n颗糖果,有3个小朋友分别叫做L,Y,K.每个小朋友想拿到至少k颗糖果,但这三个小朋友有一个共同的特点:对3反感.也就是说,如果某个小朋友拿到3颗,13颗,31颗,333颗这样数量的糖果 ...
- 清北学堂模拟赛d2t5 吃东西(eat)
题目描述一个神秘的村庄里有4家美食店.这四家店分别有A,B,C,D种不同的美食.LYK想在每一家店都吃其中一种美食.每种美食需要吃的时间可能是不一样的.现在给定第1家店A种不同的美食所需要吃的时间a1 ...
随机推荐
- 洛谷P1281 书的复制
题目描述 现在要把m本有顺序的书分给k给人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比如不能把第一.第三.第四本书给同一个人抄写. ...
- 自动生成Makefile的全过程详解
一.简介 Linux下的程序开发人员,一定都遇到过Makefile,用make命令来编译自己写的程序确实是很方便.一般情况下,大家都是手工写一个简单Makefile,如果要想写出一个符合自由软件惯例的 ...
- 36.面板Ext.Panel使用
转自:https://www.cnblogs.com/linjiqin/archive/2011/06/22/2086620.html 面板Ext.Panel使用 概要 1.Ext.Panel概述 2 ...
- SQL Server 数据字典生成脚本
SELECT sysobjects.name AS 表名称 ,--sysproperties.[value] AS 表说明 ,syscolumns.name AS 字段名称 ,--properties ...
- PCB SQL SERVER 发送邮件(异步改同步)
采用SQL SERVER发送邮件是队列方式(异步)发送邮件,所以在我们执行发送邮件后,无法立即获取到邮件是否发送成功了,而在PCB行业实际应用中是需要立即获取发送邮件是否成功的状态来决定下一步逻辑该如 ...
- [Swift通天遁地]七、数据与安全-(13)单元测试的各个状态和应用
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 慕课网3-10编程练习:简单的flex布局
小伙伴们,我们学习了伸缩容器的一些属性,接下来使用我们所学的伸缩容器属性完成下面的效果图. 完成效果: 任务 1.先将容器设置为伸缩容器 2.在垂直方向上对齐,行与行之间的空白距离一样 3.在水平方向 ...
- 记一次MySQL索引优化
两张表是主(CHECK_DRAWINGS)从(CHECK_DRAWINGS_IMG)关系. CHECK_DRAWINGS,主表数据 3591条. SELECT COUNT(*) FROM CHECK_ ...
- 【知识总结】多项式全家桶(一)(NTT、加减乘除和求逆)
我这种数学一窍不通的菜鸡终于开始学多项式全家桶了-- 必须要会的前置技能:FFT(不会?戳我:[知识总结]快速傅里叶变换(FFT)) 以下无特殊说明的情况下,多项式的长度指多项式最高次项的次数加\(1 ...
- [Windows Server 2012] IIS自带FTP配置方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频.★ 本节我们将带领大家:IIS自带FT ...