加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

HDU 3988 大数分解

发布时间:2020-12-14 04:03:15 所属栏目:大数据 来源:网络整理
导读:题意: ? ?? 这题把k素因子分解后看n!中有多少个与k对应的素因子。 n!中含有素因子p的个数为n/p+n/p^2.....取整。 #include iostream#includecstdio#includecstring#includealgorithmusing namespace std;typedef unsigned long long ll;const unsigned long

题意:

? ??

这题把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 c)
{
    ll k = 1;
    while(b)
    {
        if(b&1)
            k = Mulmod(k,a,c);
        a = Mulmod(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,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,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,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("%I64un",ans);
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读