HDU 3988 大数分解

简介:

题意:

    

这题把k素因子分解后看n!中有多少个与k对应的素因子。

n!中含有素因子p的个数为n/p+n/p^2.....取整。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
const unsigned long long oo=9223372036854775808ULL;
ll gcd(ll a,ll b)
{
    return (b==0)?a:gcd(b,a%b);
}
ll Mulmod(ll a,ll b,ll n)
{
    ll  exp = a%n, res = 0;
    while(b)
    {
        if(b&1)
        {
            res += exp;
            if(res>n) res -= n;
        }
        exp <<= 1;
        if(exp>n)
            exp -= n;
        b>>=1;
    }
    return res;
}
ll exp_mod(ll a,ll b,ll c)
{
    ll k = 1;
    while(b)
    {
        if(b&1)
            k = Mulmod(k,a,c);
        a = Mulmod(a,a,c);
        b>>=1;
    }
    return k;
}
bool Miller_Rabbin(ll n, ll times)
{
    if(n==2)return 1;
    if(n<2||!(n&1))return 0;

    ll a, u=n-1, x, y;
    int t=0;
    while(u%2==0)
    {
        t++;
        u/=2;
    }
    srand(100);
    for(int i=0; i<times; i++)
    {
        a = rand() % (n-1) + 1;
        x = exp_mod(a, u, n);
        for(int j=0; j<t; j++)
        {
            y = Mulmod(x, x, n);
            if ( y == 1 && x != 1 && x != n-1 )
                return false; //must not
            x = y;
        }
        if( y!=1) return false;
    }
    return true;
}
ll Pollard_Rho(ll n,ll c)
{
    ll x,y,d,i=1,k=2;
    y = x = rand() % (n-1) + 1;
    while(1)
    {
        i++;
        x = (Mulmod(x,x,n) + c)%n;
        d = gcd((x-y+n)%n,n);
        if(d>1&&d<n)
            return d;
        if(x==y)
            return n;
        if(i==k)
        {
            k<<=1;
            y = x;
        }
    }
}
ll factor[550],tol;
void Find_factor(ll n,ll c)
{
    if(n==1)
        return;
    if(Miller_Rabbin(n,10))
    {
        factor[tol++] = n;
        return;
    }
    ll p = n;
    ll k = c;
    while(p>=n)
        p = Pollard_Rho(p,c--);
    Find_factor(p,k);
    Find_factor(n/p,k);
}
int main()
{
    int t,ca=0,num;
    unsigned long long n,k,fac[550][2];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64u%I64u",&n,&k);
        printf("Case %d: ",++ca);
        if(k==1)
        {
            puts("inf");
            continue;
        }
        tol=0;
        Find_factor(k,120);
        unsigned long long ans=oo;
        sort(factor,factor+tol);
        num=0;
        memset(fac,0,sizeof(fac));
        fac[0][0]=factor[0],fac[0][1]=1;
        for(int i=1; i<tol; i++)
        {
            if(fac[num][0]!=factor[i])
                num++,fac[num][0]=factor[i];
            fac[num][1]++;
        }
        for(int i=0; i<=num; i++)
        {
            unsigned long long wans=0,wdiv=fac[i][0],d=n;
            while(d)
                wans+=d/wdiv,d/=wdiv;
            ans=min(ans,wans/fac[i][1]);
        }
        if(ans==oo)
            puts("inf");
        else
            printf("%I64u\n",ans);
    }
    return 0;
}



目录
相关文章
|
6月前
|
算法 测试技术 C#
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
|
算法
【学会动态规划】等差数列划分(22)
【学会动态规划】等差数列划分(22)
53 0
|
人工智能 算法 C++
[**算法**]关于数字反转的两道例题的分析思考
两个题目看着很像,但是细节不太一样,一个是去处理浮点,(其中有用STL大法的和将小数点前后和小数点分开进行输入的还有利用字符串的读写来处理的)还有一个是去处理整数
155 0
|
算法 C++
容斥原理算法的实现
容斥原理算法的实现
容斥原理算法的实现
|
机器学习/深度学习 算法 C++
算法基础系列第四章——数论之质数与约数(1)
算法基础系列第四章——数论之质数与约数(1)
186 0
算法基础系列第四章——数论之质数与约数(1)
|
算法 C++
算法基础系列第四章——数论之质数与约数(2)
算法基础系列第四章——数论之质数与约数(2)
120 0
算法基础系列第四章——数论之质数与约数(2)
|
机器学习/深度学习 BI
372. 超级次方 : 递归快速幂应用题
372. 超级次方 : 递归快速幂应用题
LeetCode 动态规划之等差数列的划分
LeetCode 动态规划之等差数列的划分
172 0
LeetCode 动态规划之等差数列的划分
|
人工智能 Python
codeforces1151B Dima(异或的性质)
codeforces1151B题解(异或的性质)
1355 0
<算法>蛇形矩阵求解
蛇形矩阵 右下,下左,左上,上右,循环往复~ 解题思路: 在单步前进过程中, x与y, 只能有一个发生变化 每次转向, x与y会发生切换 切换后, x 与 y 都与上次的 方向相反( 第一步: x 增加, x到极限后切换到y; ...
923 0