数论(算术基本定理) - Aladdin and the Flying Carpet - LightOJ 1341
题意:
Input
Output
Sample Input
2
10 2
12 2
Sample Output
Case 1: 1
Case 2: 2
分析:
注意:
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6+10;
int primes[N],cnt;
bool st[N];
int ans;
int T;
ll a,b;
void get_prime(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i]) primes[cnt++]=i;
for(int j=0;primes[j]*i<=n;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0) break;
}
}
}
int Div(ll a)
{
ll res=1;
for(int i=0;i<cnt;i++)
{
int p=primes[i];
if(a%p==0)
{
ll t=0;
while(a%p==0)
{
t++;
a/=p;
}
res*=(t+1);
}
if(p>a) break; //优化
if(a==1) break; //优化
}
if(a>1) res*=2;
return res;
}
int main()
{
get_prime(N-1);
cin>>T;
for(int t=1;t<=T;t++)
{
ans=0;
cin>>a>>b;
if(b<=sqrt(a))
{
int c=0;
ans=Div(a)/2;
for(int i=1;i<b;i++)
if(a%i==0)
c++;
ans-=c;
}
printf("Case %d: %d\n",t,ans);
}
return 0;
}