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!
原文地址:https://www.cnblogs.com/qywhy/p/9728506.html