博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2019西北工业大学程序设计创新实践基地春季选拔赛 D(卢卡斯定理)
阅读量:4339 次
发布时间:2019-06-07

本文共 1563 字,大约阅读时间需要 5 分钟。

链接:

来源:牛客网

Chino with Equation
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Chino的数学很差,因此Cocoa非常担心。今天,Cocoa要教Chino解不定方程。

众所周知,不定方程的解有0个或者若干个。
给出方程:

Cocoa想知道这个不定方程的正整数解和非负整数解各有几个。

题目对Chino来说太难啦,你能帮一帮Chino吗?

输入描述:

两个正整数m, n

输出描述:

题目要求的答案,即正整数解的个数和非负整数解的个数 。由于答案可能会很大,你只需要输出答案 mod(10 9+ 7) 即可。
 
示例1

输入

4 7

输出

20 120 解题思路: 组合数: 1.n,m比较小时:C(n,m)=C(n-1,m)+C(n-1,m-1); 2.卢卡斯定理:n,m比较大时:C(n,m)%mod=C(n%mod,m%mod)*C(n/mod,m/mod)%mod; 第一种情况:将n拆分成m个正整数的和,可以认为将n个小球放入m个盒子,每个盒子都不可为空,可以直接用隔板法,n个小球有n-1的空隙,我们只要在n-1个空隙中选择m-1个空隙放入隔板即可,答案为C(n-1,m-1) 第二种情况:将n拆分成m个非负整数的和,可以认为将n个小球放入m个盒子,但是有的盒子可以为空,不能直接使用隔板法,可以假设我们从外面拿了m个小球,以保证每个盒子至少有一个小球,然后继续又使用隔板法,n+m个小球有n+m-1个间隙,选择其中的m-1个空隙放入隔板就可以了,放完隔板后,每部分取走一个小球即为每个盒子球的个数,方案总数为C(n+m-1,m-1) 直接套用卢卡斯定理模板就可以了 代码:
#include 
#include
using namespace std;#define ll long long#define mod 1000000007ll n,m,l,r;ll qmul(ll a,ll b){ ll res=0; while(b){ if(b&1) res=(res+a)%mod; b>>=1; a=(a+a)%mod; } return res;}ll qpow(ll a,ll b){ ll res=1; while(b){ if(b&1) res=qmul(res,a); b>>=1; a=qmul(a,a); } return res;}void exgcd(ll a,ll b,ll &x,ll &y,ll &c){ if(!b){ x=1,y=0,c=a; }else{ exgcd(b,a%b,y,x,c); y-=a/b*x; }}ll INV(ll a,ll p){ ll x,y,c; exgcd(a,p,x,y,c); return (x%p+p)%p;}ll C(int a,int b){ if(a
a-b) b=a-b; ll ca=1,cb=1; for(int i=0;i

 

转载于:https://www.cnblogs.com/zjl192628928/p/10847292.html

你可能感兴趣的文章
CMU Bomblab 答案
查看>>
微信支付之异步通知签名错误
查看>>
2016 - 1 -17 GCD学习总结
查看>>
linux安装php-redis扩展(转)
查看>>
Vue集成微信开发趟坑:公众号以及JSSDK相关
查看>>
技术分析淘宝的超卖宝贝
查看>>
i++和++1
查看>>
react.js
查看>>
P1313 计算系数
查看>>
NSString的长度比较方法(一)
查看>>
Azure云服务托管恶意软件
查看>>
My安卓知识6--关于把项目从androidstudio工程转成eclipse工程并导成jar包
查看>>
旧的起点(开园说明)
查看>>
生产订单“生产线别”带入生产入库单
查看>>
crontab导致磁盘空间满问题的解决
查看>>
java基础 第十一章(多态、抽象类、接口、包装类、String)
查看>>
Hadoop 服务器配置的副本数量 管不了客户端
查看>>
欧建新之死
查看>>
自定义滚动条
查看>>
APP开发手记01(app与web的困惑)
查看>>