mcpc2017 Hopscotch 组合数

2024-03-03 04:48
文章标签 组合 hopscotch mcpc2017

本文主要是介绍mcpc2017 Hopscotch 组合数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

5095: Hopscotch

题目描述

You’re playing hopscotch! You start at the origin and your goal is to hop to the lattice point (N, N). A hop consists of going from lattice point (x1, y1) to (x2, y2), where x1 < x2 and y1 < y2.
You dislike making small hops though. You’ve decided that for every hop you make between two lattice points, the x-coordinate must increase by at least X and the y-coordinate must increase by at least Y .
Compute the number of distinct paths you can take between (0, 0) and (N, N) that respect the above constraints. Two paths are distinct if there is some lattice point that you visit in one path which you don’t visit in the other.
Hint: The output involves arithmetic mod 109+ 7. Note that with p a prime like 109+ 7, and x an integer not equal to 0 mod p, then x(xp−2) mod p equals 1 mod p.

输入

The input consists of a line of three integers, N X Y . You may assume 1 ≤ X, Y ≤ N ≤ 106.

输出

The number of distinct paths you can take between the two lattice points can be very large. Hence output this number modulo 1 000 000 007 (109+ 7).

样例输入

7 2 3

样例输出

9

题目大意:给出n,x,y,从(0,0)到(n,n)  行坐标的增加每次不小于x,列坐标的增加每次不小于y。

题目分析:如果只看一维的可以把这个题看成把n个球分成t(1~n/x)份,每一份的个数都不能小于x,可以先向每一份分上x-1,就可以看成把剩下的分成t份有多少种分发,C(n-t*(x-1)-1  ,   t-1),这就是只看一维。

如果看成二维就是 : C(n-t*(x-1)-1 , t-1)*C(n-t*(y-1)-1 , t-1)。最后把所有结果加起来就可以。

还有一点要注意的是组合数不能直接求,要先打表,而且数很大,组合数求的时候要用到逆元。

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=1e6+7; 
inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;}ll fac[maxn],inv[maxn];ll init(){fac[0]=1;for (int i=1;i<maxn;i++)fac[i]=fac[i-1]*i%mod;inv[maxn-1]=qpow(fac[maxn-1],mod-2);for (int i=maxn-2;i>=0;i--)inv[i]=inv[i+1]*(i+1)%mod;return 0;
}
ll C(ll n,ll m){if (n<m) return 0;return fac[n]*inv[m]%mod*inv[n-m]%mod;
}int main()
{ll n,x,y;init();scanf("%lld%lld%lld",&n,&x,&y);ll m=min(n/x,n/y);ll ans=0;for(ll i=1;i<=m;i++){ans=(ans+C(n-i*(x-1)-1,i-1)%mod*C(n-i*(y-1)-1,i-1)%mod)%mod;}printf("%lld\n",ans);return 0;
}




这篇关于mcpc2017 Hopscotch 组合数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768493

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

Go组合

摘要 golang并非完全面向对象的程序语言,为了实现面向对象的继承这一神奇的功能,golang允许struct间使用匿名引入的方式实现对象属性方法的组合 组合使用注意项 使用匿名引入的方式来组合其他struct 默认优先调用外层方法 可以指定匿名struct以调用内层方法 代码 package mainimport ("fmt")type People struct{}type Pe

组合c(m,n)的计算方法

问题:求解组合数C(n,m),即从n个相同物品中取出m个的方案数,由于结果可能非常大,对结果模10007即可。       共四种方案。ps:注意使用限制。 方案1: 暴力求解,C(n,m)=n*(n-1)*...*(n-m+1)/m!,n<=15 ; int Combination(int n, int m) { const int M = 10007; int

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

INDEX+SMALL+IF+ROW函数组合使用解…

很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP、INDEX+MATCH中入门的,纵然你把全部的多条件查找方法都学会了而且运用娴熟,如VLOOKUP和&、SUMPRODUCT、LOOKUP(1,0/....,但仍然只能对这种一对多的查询望洋兴叹。   这里讲的INDEX+SMALL+IF+ROW的函数组合,

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

【内网】ICMP出网ew+pingtunnel组合建立socks5隧道

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 通过环境搭建,满足以下条件: 攻击机模拟公网vps地址,WEB边界服务器(Windows Server 2008)模拟公司对外提供Web服务的机器,该机器可以通内网,同时向公网提供服务。内网同网段存在一台Windows内网服务

PyPortfolioOpt:Python中的投资组合优化工具

PyPortfolioOpt:Python中的投资组合优化工具 在金融领域,投资组合优化是一个关键的环节,它帮助投资者在追求最大回报的同时管理风险。今天,我们将探索一个名为PyPortfolioOpt的Python库,它提供了一系列的工具和算法,用于构建和优化投资组合。 概览 PyPortfolioOpt是一个开源的Python库,专门用于金融投资组合的优化。它包括经典的有效前沿、Black

读软件设计的要素03概念的组合

1. 概念的组合 1.1. 概念不像程序那样,可以用较大的包含较小的 1.1.1. 每个概念对用户来说都是平等的,软件或系统就是一组串联运行的概念组合 1.2. 概念是通过操作来同步组合的 1.2.1. 同步并不增加新的概念操作,但会限制已有的操作,从而消除一些独立概念可能会出现的操作序列 1.3. 在自由组合中,概念彼此独立,仅受一些记录的约束,这些约束是为了确保概念对事物观点的一

java设计模式day03--(结构型模式:代理模式、适配器模式、装饰者模式、桥接模式、外观模式、组合模式、享元模式)

5,结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: 代理模式 适配器模式 装饰者模式 桥接模式 外观模式 组合模式