zoukankan      html  css  js  c++  java
  • 牛客网Wannafly挑战赛25A 因子(数论 素因子分解)

    链接:https://www.nowcoder.com/acm/contest/197/A
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 262144K,其他语言524288K
    64bit IO Format: %lld

    题目描述

    令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子。

    输入描述:

    两个数n, p (1e18>= n>= 10000 >= p >= 2)

    输出描述:

    一个数
    表示k
    示例1

    输入

    复制
    10000 12

    输出

    复制
    4996


    解题思路:想说比赛的时候数据范围看错了,一直段错误的要哭了。。。首先,我们知道对于任意一个数,我们都可以把他拆分成若干素因子乘积的形式如n=p^x+q^y+……r^z(p,q,……,r为素数),因为p<=n,所以p一定是n!的一个因子,所以p中含有的素因子n!中必定含有,并且幂次小于等于n!中该素因子的幂次。我们需要求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子,所以我们只要求p分解所得的每个素因子x的幂次ccount(x),对应于n!素因子分解中x的幂次count(x),用count(x)/ccount(x)再取最小值即为答案。

    附上代码:
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll n,p,cnt;
    ll count(ll k) //计算x!的质因数分解中质因子k的幂
    {
        ll tot=0,x=n;
        while(x)
        {
            tot+=x/k;
            x/=k;
        }
        return tot;
    }
    ll ccount(ll x)  //计算x的质因数分解中质因子y的幂
    {
        ll tot=0;
        while(p%x==0)
        {
            tot++;
            p/=x;
        }
        return tot;
    }
    int main()
    {
        scanf("%lld%lld",&n,&p);
        ll ans=1e18;
        for(int i=2;i<=p;i++)
            if(p%i==0)
            ans=min(ans,count(i)/ccount(i));
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    Python初学笔记
    linux学习笔记一----------文件相关操作
    Linux目录结构及常用命令(转载)
    最简单冒泡事件及阻止冒泡事件
    IDEA 从SVN检出项目相关配置
    拦截器实现原理
    CUDA基本概念
    1.2CPU和GPU的设计区别
    RAM和DDR
    Myriad2 简介
  • 原文地址:https://www.cnblogs.com/zjl192628928/p/9725933.html
Copyright © 2011-2022 走看看