Wannafly挑战赛25 因子 数论

Posted cnxuyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wannafly挑战赛25 因子 数论相关的知识,希望对你有一定的参考价值。

一、题意

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

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

二、分析

2.1前置知识:阶乘质因数分解

定理:在n!的标准分解式中,质因数p的指数h为

[h = left[ {frac{n}{p}} ight] + left[ {frac{n}{{{p^2}}}} ight] + ... = sumlimits_{r = 1}^infty  {left[ {frac{n}{{{p^r}}}} ight]} ]

推论:n!可以由他的质因数表示为

[n! = prodlimits_{p le n} {{p^{sum {left[ {frac{n}{{{p^r}}}} ight]} }}} ]

2.2本题思路

由题意可得,p的质因数肯定是n!的质因数;所以首先将p做质因数分解,得到p的各个质因数的指数h,再对每一个p的质因数求其在n!中的指数H

那么题中所求的K肯定是每一对H/h的数值中的最小值

[ans = arg min frac{{{H_i}}}{{{h_i}}}]

三、代码

 

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 const long long INF = 1e18+10;
 5 long long n,p;
 6 long long H(long long i)
 7 {
 8     long long res = 0;
 9     long long temp = n;
10     while(temp)
11     {
12         res += temp/i;
13         temp /= i;
14     }
15     return res;
16 }
17 void Solve()
18 {
19     long long ans = INF;
20     for(int i=2;i<=p;i++)
21     {
22         if(p%i == 0)
23         {
24             long long h = 0;
25             while(p%i==0)
26             {
27                 h++;
28                 p/=i;
29             }
30             ans = min(ans,H(i)/h);
31         }
32     }
33     printf("%lld
",ans);    
34 }
35 int main()
36 {
37     while(scanf("%lld%lld",&n,&p)!=EOF)
38     {
39         Solve();
40     }
41     return 0;
42 }

 

以上是关于Wannafly挑战赛25 因子 数论的主要内容,如果未能解决你的问题,请参考以下文章

Wannafly挑战赛25 B.面积并

Wannafly挑战赛25 B 面积并 数学

Wannafly挑战赛25 C 期望操作数 数学

Wannafly挑战赛27

Wannafly挑战赛21A

Wannafly挑战赛4. B