码迷,mamicode.com
首页 > 其他好文 > 详细

NEFU119 组合素数【算术基本定理】

时间:2015-02-04 23:27:42      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://acm.nefu.edu.cn/JudgeOnline/problemshow.php?problem_id=119


题目大意:

给你两个整数N和P,求出C(2*N,N)被素数p整数的次数。


思路:

由算术基本定理的性质(5)可得到N!被素数P整除的次数。

来看这道题,C(2*N,N) = (2*N)! / (N! * N!)。最终结果就是从(2*N)!能被素数P整除的

次数里边减去N!能被素数整除的次数*2。最终结果为:

[2*N/P] + [2*N/P^2] + … + [2*N/P^t] - 2*([N/P] + [N/P^2] + … + [N/P^t])。

其中次数t = logP(2*N),即log10(2*N) / log10(P)。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int main()
{
    int T, N, P, tag, sum;
    cin >> T;
    while(T--)
    {

        cin >> N >> P;
        sum = 0;
        double s = 0.0;
        s = ( log10(N*2.0)/log10(P*1.0) );
        tag = 1;
        for(int i = 1; i <= (int)s; ++i)
        {
            tag *= P;
            sum += (int)(2*N/tag) - 2*(int)(N/tag);
        }
        cout << sum << endl;
    }

    return 0;
}


NEFU119 组合素数【算术基本定理】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/43497237

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!