hdu 3988 Harry Potter and the Hide Story——数论

比赛的时候素数表打搓了……后来实在没办法就改成给一个k就用根k的复杂度把它分解掉,然后4500MS蹭过去了……下来知道还是要打素数表的。。先开始打素数表的时候prime[0]怎么打都是1,搞得我烦死,后来我一看,我的MAXN和PRIME设定了以后,开数组的时候忘记的+10,导致最后越界,可能就会出错吧。改过来就没事了。。。先开始还犯了两个错误:1.k,n搞反了    2.分子分母搞反了……

思路就是,这个题只用对k做素数分解,然后看它在n!中相应的素数的指数,从而求出i的最大值。

PS:这是我第一次看见cin,cout比scanf,printf快的……而且关了同步还会wa。。

2011-08-31 10:21:46 Accepted 3988 828MS 15604K 1416 B G++ Tiramitu
#include<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<cmath>
#include
<algorithm>
#include
<vector>
#include
<iostream>
#define MAX 10000000
#define PRIME 700000
#define INF 9223372036854775807LL

using namespace std;

long long T,m,n,ans;
bool isprime[MAX+10];
long long prime[PRIME+10],top=0;

void init(void)
{
int i,j;
memset(prime,
0,sizeof(prime));
memset(isprime,
0,sizeof(isprime));
for(i=2;i<=MAX;i++)
{
if(!isprime[i])
{
prime[top]
=i;
top
++;
for(j=1;j*i<=MAX;j++)
{
isprime[i
*j]=true;
}
}
}
top
--;
// prime[0]=2;
// for(i=0;i<=20;i++)
// cout<<prime[i]<<" ";
}

long long getnum(long long x)
{
long long temp=n,ret=0;
while (temp)
{
temp
/=x;
ret
+=temp;
}
return ret;
}

void solve()
{
for (long long i=0;prime[i]*prime[i]<=m&&i<=top;i++)
{
long long now=prime[i];
if (m%now==0)
{
long long cnt=0;
while (m%now==0) m/=now,cnt++;
long long temp=getnum(now)/cnt;
ans
=ans<temp?ans:temp;
}
}
if(m!=1)
{
long long temp=getnum(m);
ans
=ans<temp?ans:temp;
}
}

int main()
{
cin
>>T;
init();
for (long long k=1;k<=T;k++)
{
cin
>>n>>m;
cout
<<"Case "<<k<<": ";
ans
=INF;
if(m==1)
{
puts(
"inf");
continue;
}
else if(n==1)
{
puts(
"0");
continue;
}
solve();
if (ans==INF) printf("inf\n");
else cout<<ans<<endl;
}
}

  

你可能感兴趣的:(ide)