uva10780 - Again Prime? No time
uva10780 - Again Prime? No time
?
?
Again Prime? No time.
The problem statement is very easy. Given a number?n?you have to determine the largest power of?m, not necessarily prime, that divides?n!.
? ?
Input
The input file consists of several test cases. The first line in the file is the number of cases to handle. The following lines are the cases each of which contains two integers?m (1?and?n (0. The integers are separated by an space. There will be no invalid cases given and there are not more that?500?test cases.
Output
? ?
For each case in the input, print the case number and result in separate lines. The result is either an integer if?m?divides?n!?or a line "Impossible to divide" (without the quotes). Check the sample input and output format.
? ?
Sample Input
2
2 10
2 100
Sample Output
Case 1:
8
Case 2:
97
?
題目大意:給定m和n,求一個(gè)最大正整數(shù)k,使得m^k能夠被n!整除,變相問(wèn)n!中有多少個(gè)m;
?
思路:開(kāi)始想到的是從2-n遍歷,把每個(gè)數(shù)中有多少的m都找出來(lái),后來(lái)發(fā)現(xiàn)缺陷是m不是質(zhì)數(shù),例如4*9和6,就找不出有6,實(shí)際上應(yīng)該有兩個(gè)!正確的解法是分解質(zhì)因數(shù),然后找出有多少對(duì)質(zhì)因數(shù)即可。當(dāng)然要找的是對(duì)于每個(gè)質(zhì)數(shù)的最小值.
code:#include <iostream>#include <cmath>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
const int M=0x7fffffff;
const int N=10010;
bool ft[N];
int prime[N],t=0;
void init() //打素?cái)?shù)表
{
memset(ft,true,sizeof(ft));
ft[0]=ft[1]=false;
for (int i=2;i<N;i++)
{
if (!ft[i]) continue;
prime[++t]=i;
for (int j=2*i;j<N;j+=i)
ft[j]=false;
}
}
int main()
{
init();
int T;
int m,n;
int i,j;
scanf("%d",&T);
for (int ca=1;ca<=T;ca++)
{
scanf("%d %d",&m,&n);
int ans=M,p=1;
while (m>1)
{
int ct=0;
while (m%prime[p]==0) //分解素?cái)?shù),從前往后找
{
ct++;
m/=prime[p];
}
if (ct==0){p++; continue;}
if (prime[p]>n){ans=-1; break;}
int nt=0;
for (i=prime[p];i<=n;i*=prime[p])
nt+=n/i;
ans=min(ans,nt/ct); //選出最小的素?cái)?shù)比,也就是ans個(gè)素?cái)?shù)對(duì)
}
printf("Case %d:\n",ca);
if (ans==-1) cout<<"Impossible to divide"<<endl;
else cout<<ans<<endl;
}
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的uva10780 - Again Prime? No time的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么看输卵管造影通不通
- 下一篇: 【转载】最短路径之Dijkstra算法详