任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 N=P1a1 P2a2P3a3…Pnan,这里P1<P2<P3…<Pn均为质数,其中指数ai是正整数。这样的分解称为 N 的标准分解式.
应用是n的因子个数 = (1+a1)(1+a2)…(1+an)
样例:
1000=2* 500=2* (2 * 250)=2 * 2 *( 2 * 125)=2 * 2 * 2 *(5 * 25)=2 * 2 * 2 * 5 * 5 *5=23*53
Aladdin and the Flying Carpet LightOJ - 1341
一个长方形, 给出面积a , 限制其最短的边长必须大于等于b , 求有几种组合方式。
先用唯一分解定理求出a的因子个数再减去不满足的
如果b都是接近1e6的数,按照时间复杂度来说是必超时的,但是拿dfs求a小于b的因子,我写了一个晚上都超时了,prime【i】<n,
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1000000;
long long prime[N+100],vis[N+100],k,siz;
int nu[100];
void getprime()
{
k=0;
memset(vis,0,sizeof(vis));
vis[1]=1;
for(int i=2; i<=N; i++)
{
if(!vis[i])
{
prime[k++]=i;
for(int j=i*2; j<=N; j=j+i)
vis[j]=1;
}
}
}
long long cal(long long n)
{
long long ans=1,num,i;
siz=0;
for(i=0; i<k&&prime[i]*prime[i]<=n; i++)
{
if(n%prime[i]==0)
{
num=0;
while(n%prime[i]==0)
{
num++;//printf("%d\n",num);
n/=prime[i];
}
nu[siz++]=num;
//printf("%d\n",nu[siz-1]);
ans*=(num+1);
}
}
if(n<=1)
ans/=2;
return ans;
}
int main()
{
getprime();
int t,p=1;
scanf("%d",&t);
while(t--)
{
long long a,b,num=1,n,i;
scanf("%lld%lld",&a,&b);
n=a;
if(a<b*b)
{
num=0;
}
else
{
num=cal(n);
// dfs(0,0,0);
for(i=1; i<b; i++)
if(a%i==0)
num--;
}
printf("Case %d: %lld\n",p++,num);
}
return 0;
}