HDOJ 3037 Saving Beans (Lucas定理)
2016-02-23 00:02
267 查看
Saving Beans
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3533 Accepted Submission(s): 1350
[align=left]Problem Description[/align]
Although winter is far away, squirrels have to work day and night to save beans. They need plenty of food to get through those long cold days. After some time the squirrel family thinks that they have to solve a problem. They suppose
that they will save beans in n different trees. However, since the food is not sufficient nowadays, they will get no more than m beans. They want to know that how many ways there are to save no more than m beans (they are the same) in n trees.
Now they turn to you for help, you should give them the answer. The result may be extremely huge; you should output the result modulo p, because squirrels can’t recognize large numbers.
[align=left]Input[/align]
The first line contains one integer T, means the number of cases.
Then followed T lines, each line contains three integers n, m, p, means that squirrels will save no more than m same beans in n different trees, 1 <= n, m <= 1000000000, 1 < p < 100000 and p is guaranteed to be a prime.
[align=left]Output[/align]
You should output the answer modulo p.
[align=left]Sample Input[/align]
2
1 2 5
2 1 5
[align=left]Sample Output[/align]
3
3
Hint
Hint
For sample 1, squirrels will put no more than 2 beans in one tree. Since trees are different, we can label them as 1, 2 … and so on.
The 3 ways are: put no beans, put 1 bean in tree 1 and put 2 beans in tree 1. For sample 2, the 3 ways are:
put no beans, put 1 bean in tree 1 and put 1 bean in tree 2.
思路:简单的组合数学,ans=C(n+m,m)%P,因为涉及到取模而且数据较大,所以说就是Lucas定理了
ac代码:
#include<stdio.h> #include<math.h> #include<string.h> #include<stack> #include<set> #include<queue> #include<vector> #include<iostream> #include<algorithm> #define MAXN 1010000 #define LL long long #define ll __int64 #define INF 0xfffffff #define mem(x) memset(x,0,sizeof(x)) #define PI acos(-1) using namespace std; LL gcd(LL a,LL b){return b?gcd(b,a%b):a;} LL lcm(LL a,LL b){return a/gcd(a,b)*b;} LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;} //head LL f[MAXN]; void findinit(LL p) { f[0]=1; for(int i=1;i<=p;i++) f[i]=(f[i-1]*i)%p; } LL lucas(LL n,LL m,LL p) { LL ans=1; while(n&&m) { LL a=n%p,b=m%p; if(a<b) return 0; ans=(ans*f[a]*powmod(f[b]*f[a-b]%p,p-2,p))%p; n/=p;m/=p; } return ans; } int main() { LL n,m,p; int t; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld",&n,&m,&p); findinit(p); LL ans=lucas(n+m,m,p); printf("%lld\n",ans); } return 0; }
相关文章推荐
- Object-C中nil、Nil、NULL与NSNull的一些理解
- iOS 数据存储的常用方式
- iOS --自定义导航栏
- iOS常见面试题
- Runloop的基本使用
- const,static,extern简介
- runtime的使用
- 【Objective-C】07-自定义构造方法和description方法
- Mac环境下svn的使用
- 【C语言】17-预处理指令3-文件包含
- 【C语言】14-返回指针的函数与指向函数的指针
- 网络处理2-异步POST请求和同步请求
- CALayer3-层的属性
- CALayer2-创建新的层
- 【零基础学习iOS开发】【02-C语言】11-函数的声明和定义
- 【C语言】07-基本语句和运算
- 【C语言】08-数组
- 【零基础学习iOS开发】【02-C语言】02-第一个C语言程序
- loadView、viewDidLoad及viewDidUnload的关系
- 网络处理1-异步GET请求