2021牛客NOIP提高组第二场T2——方格计数(组合数计数)

方格计数

  • description
  • solution
  • code

description

在左下角是 (𝟎, 𝟎),右上角是 (W, H)的网格上,有 (W + 1) × (H + 1) 个格点。
现在要在格点上找 N个不同的点,使得这些点在一条直线上。并且在这条直线上,
相邻点之间的距离不小于𝐃。求方案数模 109 + 7

【输入格式】
第一行一个整数 𝐓,表示数据组数。
接下来 𝐓 行,每行四个整数 N, W, H, D,意义如题目描述。

【输出格式】
𝐓 行,每行一个整数表示答案。

【样例 1 输入】

7
2 2 3 3
1 4 5 3
1 251 497 2
5 40 28 10
2 2 2 2
18 60 58 2
19 2 58 4

【样例 1 输出】

9
30
125496
597
16
172006701
0  

【数据范围】

对于 100% 的数据, 1 ≤ N ≤ 50, 1 ≤ W, H, D ≤ 500, 1 ≤ T ≤ 20

solution

在一个以(0,0)(0,0)(0,0)开始的二维网格中,一条线段(0,0)−(x,y)(0,0)-(x,y)(0,0)(x,y)含有整数点的个数为gcd⁡(x,y)−1\gcd(x,y)-1gcd(x,y)1(不包含线段的两个整数端点)

nnn个盒子,从中选mmm个,且相邻两个盒子之间至少有kkk个盒子的组合方案为(n−k(m−1)m)\binom{n-k(m-1)}{m}(mnk(m1))

证明:mmm个盒子会造成m−1m-1m1个长度至少为kkk的盒子空隙,减去这(m−1)k(m-1)k(m1)k个盒子,剩下的就相当于是随便选位置了


首先,暴力的想法,枚举两个端点,横坐标之差的绝对值为xxx,纵坐标之差的绝对值为yyy,那么这里面包含的整数点个数为g−1,g=gcd⁡(x,y)g-1,g=\gcd(x,y)g1,g=gcd(x,y)

强制两个端点必须选,那么剩下还要选n−2n-2n2

求出相邻两个盒子之间编号差至少为kkk(利用两点间距离公式和题目要求的ddd),即两个盒子之间的盒子个数至少为k−1k-1k1

两个端点选了会导致两个k−1k-1k1的长度区间盒子不能选

剩下的盒子数只有g−1−2(k−1)g-1-2(k-1)g12(k1)

套用上面的组合数公式,即(g−1−2(k−1)−(n−3)(k−1)n−2)\binom{g-1-2(k-1)-(n-3)(k-1)}{n-2}(n2g12(k1)(n3)(k1))

不难发现,最后只与横纵坐标差有关,所以直接枚举横纵坐标差,乘以情况数(w−x+1)(h−y+1)(w-x+1)(h-y+1)(wx+1)(hy+1)即可

但是这个差是绝对值差,所以如果不是水平或竖直线,就有两种情况(可以理解为yyy有正负,一条指向左方的线对称有指向右方的线;也可以理解为xxx有正负,一条指向下方的线对称有一条指向上方的线)

code

#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 505
#define int long long
#define mod 1000000007
int T, n, w, h, d;
int c[maxn][maxn];void init() {for( int i = 0;i < maxn;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = ( c[i - 1][j] + c[i - 1][j - 1] ) % mod;}
}int gcd( int x, int y ) {if( ! y ) return x;else return gcd( y, x % y );
}double calc( int x, int y ) {return sqrt( x * x * 1.0 + y * y );
}int solve( int x, int y ) {if( ! x and ! y ) return 0;int g = gcd( x, y );int k = ( int )ceil( d / calc( x / g, y / g ) );if( k * ( n - 1 ) > g ) return 0;int ans = c[g - 1 - 2 * ( k - 1 ) - ( k - 1 ) * ( n - 3 )][n - 2];if( x and y ) ans = ( ans << 1 ) % mod;return ans * ( w - x + 1 ) % mod * ( h - y + 1 ) % mod; 
}signed main() {init();scanf( "%lld", &T );while( T -- ) {scanf( "%lld %lld %lld %lld", &n, &w, &h, &d );if( n == 1 ) {printf( "%lld\n", ( w + 1 ) * ( h + 1 ) );continue;}int ans = 0;for( int i = 0;i <= w;i ++ )for( int j = 0;j <= h;j ++ )ans = ( ans + solve( i, j ) ) % mod;printf( "%lld\n", ans );}return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Acwing 1085. 不要62

Acwing 1085. 不要62 题意&#xff1a; 问[n,m]这些数中有多少数不包含4&#xff0c;且不包含连续的62 题解&#xff1a; 经典数位dp&#xff0c;分析过程以前的数位dp博客有写 Acwing 1082. 数字游戏 代码&#xff1a; #include<bits/stdc.h> #define debug(a,b) …

ybtoj洛谷P4406三角形面积并(扫描线)

解析 暴力求出所有三角形之间的所有交点&#xff0c;提出所有的横坐标。 然后任意两个相邻的横坐标之间的面积都是若干个梯形。 那么就可以求出对于每一个横坐标截得的三角形长度的并的和&#xff0c;然后加在一起乘高除以二即可。 在这里插入代码片#include<bits/stdc.h&…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

[NowCoder牛客]2021NOIP提高组模拟赛第二场T3——树数树(启发式合并堆)

树数树descriptionsolutioncodedescription 【题目描述】 牛牛有一棵 n 个点的有根树&#xff0c;根为 1。 我们称一个长度为 m 的序列 a 是好的&#xff0c;当且仅当&#xff1a; • ∀&#x1d456;∈(1,&#x1d45a;]∀&#x1d456;∈(1, &#x1d45a;]∀i∈(1,m]&#…

Acwing1086. 恨7不成妻(未解决)

Acwing1086. 恨7不成妻 题意&#xff1a; 问一个区间内与7无关的整数的平方和 与7有关包括&#xff1a; 1.整数中某一位是 7&#xff1b; 2.整数的每一位加起来的和是 7 的整数倍&#xff1b; 3.这个整数是 7 的整数倍。 题解&#xff1a; 数位dp&#xff0c;有点难。。 这…

模板:拓展kmp(Z函数)

所谓拓展kmp&#xff0c;就是拓展的kmp &#xff08;逃&#xff09; 前言 小清新算法&#xff0c;更像一个trick。 exkmp能够在线性复杂度内求出字符串所有后缀与字符串本身的lcp。 个人感觉这个东西和kmp关系不大&#xff0c;反而有些像马拉车的思想。 之前学的东西&#xf…

牛客NOIP2021提高组OI赛前模拟赛第一场T3——与巨(数学)

与巨descriptionsolutioncodedescription 【题目描述】 定义无穷序列f:f11,fnfn−1∗21f:f_11,f_nf_{n-1}*21f:f1​1,fn​fn−1​∗21 定义函数G(x)min⁡fi≥x(fi)G(x)\min_{f_i\ge x}(f_i)G(x)minfi​≥x​(fi​) 定义dpc,00,dpc,imax⁡(dpc,i−1,[((i∗c)&G(i))i]∗i)…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…

2016ICPC沈阳站

2016ICPC沈阳站 题号题目知识点难度AThickest Burger贪心签到BRelative atomic mass贪心签到CRecursive sequence矩阵快速幂快铜DWinning an AuctionECounting Cliquesdfs剪枝稳铜快银FSimilar RotationsGDo not pour outHGuessing the Dice RollIThe ElderJQuery on a graphK…

P7516 [省选联考 2021 A/B 卷] 图函数

解析 纯纯的人类智慧题。 关键性质&#xff1a;vvv 可以在计算 f(u,G)f(u,G)f(u,G) 时产生贡献&#xff0c;当且仅当 GGG 中 u,vu,vu,v 之间可以通过 [v,n][v,n][v,n] 的点互相到达。 充分性较为显然&#xff0c;编号更大的点不会比 vvv 先删去&#xff0c;所以必然在 vvv 时…

开发语言大爆炸的时代,究竟谁主沉浮?

开发语言大爆炸的时代&#xff0c;究竟谁主沉浮&#xff1f;当这个系列本来打算是写人物的&#xff0c;而且是写我们身边那些优秀的开发者&#xff0c;然而当第一篇文章&#xff0c;写的是关于我们长沙.NET社区的优秀开发者邹琼俊&#xff0c;发表在博客园之后&#xff0c;有一…

2021牛客NOIP提高组OI赛前模拟赛第一场T2——牛牛和数组操作(区间dp)

牛牛和数组操作descriptionsolutioncodedescription 【题目描述】 有n 2个整数a0, a1, . . . , an, an1&#xff0c; a0 an1 0。你需要做确切地n次操作&#xff0c;每次 操作为以下形式&#xff1a; 选择一个整数x满足ax ≠ 0&#xff0c;使得ax 0&#xff0c;令lmaxi<…

杜教BM模板(用于求线性递推公式第N项)

通过手动求出线性递推公式的前几项&#xff08;一般要前8项&#xff09;&#xff0c;杜教BM模板可以直接求第n项是多少。。我才知道&#xff0c;离谱。。对于我来说是妙计 //递推公式黑科技 #include<bits/stdc.h> using namespace std; ///#define X first //#define Y…

Asp.NETCore轻松学系列阅读指引目录

前言耗时两个多月&#xff0c;坚持写这个入门系列文章&#xff0c;就是想给后来者更好更快的上手体验&#xff0c;这个系列可以说是从入门到进阶&#xff0c;适合没有 .NETCore 编程经验到小白同学&#xff0c;也适合从 .NET Framework 迁移到 .NETCore 的朋友。本系列从安装环…

P6620 [省选联考 2020 A 卷] 组合数问题(斯特林数、下降幂)

解析 给出 n,x,pn,x,pn,x,p 和一个 mmm 次的多项式 f(k)f(k)f(k)&#xff0c;求解&#xff1a; ∑k0nf(k)xk(nk)modp\sum_{k0}^nf(k)x^k\binom n k\mod pk0∑n​f(k)xk(kn​)modp 把多项式拆成若干个单项式&#xff0c;现在就是要求&#xff1a; ∑k0nkpxk(nk)\sum_{k0}^nk^px…

CF750G New Year and Binary Tree Paths(数位dp二进制+数学)

CF750G New Year and Binary Tree Pathsdescriptionsolutioncodedescription 题目链接 一颗无穷个节点的完全二叉树。 求有多少条树上的简单路径编号和为 s。 s≤1e15s\le 1e15s≤1e15 solution 一条单链的情况 考虑从节点xxx开始走一条节点个数是hhh的链&#xff08;链长为…

eShopOnContainers 知多少[9]:Ocelot gateways

引言客户端与微服务的通信问题永远是一个绕不开的问题&#xff0c;对于小型微服务应用&#xff0c;客户端与微服务可以使用直连的方式进行通信&#xff0c;但对于对于大型的微服务应用我们将不得不面对以下问题&#xff1a;如何降低客户端到后台的请求数量&#xff0c;并减少与…

Acwing 1072. 树的最长路径

Acwing 1072. 树的最长路径 题意&#xff1a; 每个边有权值&#xff0c;求树的直径 题解&#xff1a; 两遍dfs可以求&#xff0c;这里用树形dp的方法&#xff0c;我们将1作为根节点来看这棵树 我们可以将点看作是钉子&#xff0c;边就是挂在钉子上的绳子&#xff0c;我们只…

模板:矩阵树定理

文章目录前言解析无向图有向图根向树叶向树code带权图code所谓矩阵树定理&#xff0c;就是用矩阵解决树问题的定理。 &#xff08;逃&#xff09; 前言 神奇科技。 之前一直没有写博客&#xff0c;觉得还是写一发比较好。 证明什么的是不可能会的 背下来背下来&#xff01; …

P2016 战略游戏

P2016 战略游戏 题意&#xff1a; 他要建立一个古城堡&#xff0c;城堡中的路形成一棵无根树。他要在这棵树的结点上放置最少数目的士兵&#xff0c;使得这些士兵能了望到所有的路。 注意&#xff0c;某个士兵在一个结点上时&#xff0c;与该结点相连的所有边将都可以被了望…