HDU 4344 大数分解

简介:

题意:给出一条长n的绳子,则有很多长为L的均分方法,找出一个L的集合,集合内元素两两不互素,并且要求元素最多,然后求和。

很容易看出来,有多少个素因子就有多少个元素,再把求出次幂求和就行,我的模板超时。。网上找了模板。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <map>
using namespace std;
typedef __int64 ll;
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[200],cnt;
void Find_factor(ll n,ll c)
{
    if(n==1)
        return;
    if(Miller_Rabbin(n,6))
    {
        factor[cnt++] = 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);
}
ll a_b(ll a,ll b)
{
    ll ans = 1;
    for(ll i=0; i<b; i++)
        ans*=a;
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    ll n;
    while(t--)
    {
        scanf("%I64d",&n);
        cnt = 0;
        Find_factor(n,120);
        map<ll,int>m0;
        for(int i=0; i<cnt; i++)
        {
            m0[factor[i]]++;
        }
        map<ll,int>::iterator iter;
        int size = m0.size();
        if(size==1)
        {
            printf("%d %I64d\n",size,n/factor[0]);
            continue;
        }
        ll sum = 0;
        for(iter=m0.begin(); iter!=m0.end(); iter++)
            sum+=a_b(iter->first,iter->second);
        printf("%d %I64d\n",size,sum);
    }
    return 0;
}


目录
相关文章
|
6月前
|
算法 测试技术 C#
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
【状态压缩 动态规划 数论】1799. N 次操作后的最大分数和
|
6月前
|
算法 测试技术 C#
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
|
人工智能
Leetcode53/152—最大子数组和/最大子数组乘积(状态转移方程/不熟)
Leetcode53/152—最大子数组和/最大子数组乘积(状态转移方程/不熟)
109 0
|
机器学习/深度学习 算法 C++
算法基础系列第四章——数论之质数与约数(1)
算法基础系列第四章——数论之质数与约数(1)
181 0
算法基础系列第四章——数论之质数与约数(1)
|
算法 C++
算法基础系列第四章——数论之质数与约数(2)
算法基础系列第四章——数论之质数与约数(2)
120 0
算法基础系列第四章——数论之质数与约数(2)
|
机器学习/深度学习 BI
372. 超级次方 : 递归快速幂应用题
372. 超级次方 : 递归快速幂应用题
553. 最优除法 : 数学类贪心运用题
553. 最优除法 : 数学类贪心运用题
|
人工智能 Python
codeforces1151B Dima(异或的性质)
codeforces1151B题解(异或的性质)
1354 0
<算法>蛇形矩阵求解
蛇形矩阵 右下,下左,左上,上右,循环往复~ 解题思路: 在单步前进过程中, x与y, 只能有一个发生变化 每次转向, x与y会发生切换 切换后, x 与 y 都与上次的 方向相反( 第一步: x 增加, x到极限后切换到y; ...
919 0
数论 + 公式 - HDU 4335 What is N?
What is N?  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=4335   Mean:  给你三个数b、P、M,让你求有多少个n满足下式。
860 0