Wannafly挑戰賽25 因子 數論

來源:互聯網
上載者:User

標籤:思路   temp   最小   ++   iostream   ...   質因數   style   using   

一、題意

令 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}} \right] + \left[ {\frac{n}{{{p^2}}}} \right] + ... = \sum\limits_{r = 1}^\infty  {\left[ {\frac{n}{{{p^r}}}} \right]} \]

推論:n!可以由他的質因數表示為

\[n! = \prod\limits_{p \le n} {{p^{\sum {\left[ {\frac{n}{{{p^r}}}} \right]} }}} \]

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\n",ans);    34 }35 int main()36 {37     while(scanf("%lld%lld",&n,&p)!=EOF)38     {39         Solve();40     }41     return 0;42 }

 

Wannafly挑戰賽25 因子 數論

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.