您的位置:首页 > 其它

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

2014-10-06 16:48 786 查看
喵喵的神∙数
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: