zoukankan      html  css  js  c++  java
  • Wannafly挑战赛25 A 因子 数学

    题面

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

    题解:我们要找得也就是k满足 x%(p^k)==0 同时 x%(p^k*p)!=0 显然这样的k 就是x范围内最大的那个p的幂次 因为再乘个p肯定就超过x了

            我们也许会首先想到,直接看x里有多少p的倍数就行了,但是很显然,对于样例p=12,有单独的因子3和4结合,因子2和6结合,也可以满足

            所以我们显然对p进行处理 处理成p=2^x * 3^y * 5^z…… 

            例如样例p=12 n=10000 p=2^2 * 3

            我们先统计n!里有多少个2  

            t=n/2+n/4+n/8+n/16……

            而每个p需要2个2 所以 需要 t/2 个2^2

            统计n!有多少个3

            同理 o=n/3+n/9+n/27+n/81 需要o/1 个 3^1

            t,o中最小的就是答案,p的最小幂次

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 long long n,p,k,sum,t,nn;
     4 int main()
     5 {
     6     cin>>n>>p;
     7     k=1e18;
     8     for (int i=2;i<=p;i++) 
     9         if (p%i==0)
    10         {
    11             nn=n;sum=0;
    12             while (nn)
    13             {
    14                 nn/=i;
    15                 sum+=nn;
    16             }
    17             t=0;
    18             while (p%i==0)
    19             {
    20                 p/=i;
    21                 t++;
    22             }                
    23             k=min(k,sum/t);
    24         }
    25     printf("%lld",k);
    26 }
    Anderyi!
  • 相关阅读:
    遍历二维数组
    冒泡跟扫描共用
    1.8作业
    1.7作业
    1.5作业
    百文百鸡 水仙花数 百马百担
    for循环输出九九乘法表
    循环语句
    1.4作业
    07、找出1-99之间的同构数
  • 原文地址:https://www.cnblogs.com/qywhy/p/9728506.html
Copyright © 2011-2022 走看看