CPC23-4-K. 喵喵的神数 (数论 Lucas定理)

喵喵的神∙数
Time Limit: 1 Sec Memory Limit: 128 MB


Description
喵喵对组合数比較感兴趣,而且对计算组合数很在行。

同一时候为了追求有后宫的素养的生活,喵喵每天都要研究
质数。

我们先来复习一下什么叫做组合数。对于正整数P、T  
                                                       
然后我们再来复习一下什么叫质数。质数就是素数,假设说正整数N的约数仅仅有1和它本身,N就是质数;另外。
1不是质数。
今天,喵喵想要知道

                                 
Input
输入第一行是一个整数N(N<=1000)。
接下来N行,每行包含一个正整数T和一个质数P(1<=P<=T<231)。
Output
包含N行,依据输入的顺序。每一行为一个整数:
Sample Input
2
3 2
10 3
Sample Output
1
0
HINT
Source
CPC3




解题思路:

这题是纯数学题,唉,数学就是硬伤啊!

搞了半天。没有结果。果断百度了一下,结果搜到了不明觉历的Lucas定理,据说是专门解决C(n, m)%p的,当中p是质数。

Lucas定理叙述例如以下:

        数论Lucas定理是用来求 c(n,m) mod p的值,p是素数(从n取m组合。模上p)。
描写叙述为:
Lucas(n,m,p)=cm(n%p,m%p)* Lucas(n/p,m/p,p)
Lucas(x,0,p)=1;
本题中,让求的是,所以。n = p, 代入得 Lucas(n,m,p)  =   cm(n%p, m%p)* Lucas(n/p, m/p, p)
                                                                                                             =    cm(n%p, p%p)* Lucas(n/p, p/p, p)
                                                                                                             =    cm(n%p, 0)* Lucas(n/p, 1, p)
                                                                                                             =    1 * Lucas(n/p, 1, p)
                                                                                                             =    C(n/p, 1) % p 
=    C(n/p, 1) % p 
=    ( n/p ) % p





AC代码:
#include <iostream>
#include <cstdio>
using namespace std;

int main(){
	freopen("in.txt", "r", stdin);
	int n, t, p;
	cin >> n;
	while(n--){
		cin >> t >> p;
		cout << (t / p) % p << endl;
 	}
 	return 0;
}



posted @ 2017-07-27 20:16  yxysuanfa  阅读(232)  评论(0编辑  收藏  举报