题意:给定整数 a 和 b ,求区间[b, a] 内的 a 的约数的个数。
算术基本定理(唯一分解定理)
一个大于1的正整数N,如果它的标准分解式为:
,
#include<iostream>
#include<cstdio>
#include<string>
#include<string.h>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#include<map>
#include<vector>
#include<queue>
#include<stack>
//#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 1050;
const int MAXN=1000010;
int prime[MAXN+1];
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2; i<=MAXN; ++i)
{
if(!prime[i])
prime[++prime[0]]=i;
for(int j=1; j<=prime[0] && prime[j]<=MAXN/i; j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
long long factor[100][2];
int fatCnt;
int getFactors(long long x)
{
fatCnt=0;
long long tmp=x;
for(int i=1; prime[i]<=tmp/prime[i]; i++)
{
factor[fatCnt][1]=0;
if(tmp%prime[i]==0)
{
factor[fatCnt][0]=prime[i];
while(tmp%prime[i]==0)
{
factor[fatCnt][1]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=1)
{
factor[fatCnt][0]=tmp;
factor[fatCnt++][1]=1;
}
return fatCnt;
}
int main()
{
getPrime();
int t;
cin>>t;
int casee=1;
LL a,b;
while(t--)
{
// cin>>a>>b;
scanf("%lld%lld",&a,&b);
if(a/b<b)
{
printf("Case %d: 0n",casee++);
continue;
}
int cnt=getFactors(a);
// cout<<cnt<<endl;
int ans=1;
for(int i=0; i<cnt; ++i)
{
//cout<<factor[i][0]<<endl;
ans*=(factor[i][1]+1); //唯一分解定理
}
ans>>=1;
for(int i=1; i<b; ++i)
{
if(a%i==0)
{
ans--;
}
}
printf("Case %d: %dn",casee++,ans);
}
return 0;
}
素数筛选和合数分解
const int MAXN=1000010;
int prime[MAXN+1];
//线性筛选
void getPrime()
{
memset(prime,0,sizeof(prime));
for(int i=2; i<=MAXN; ++i)
{
if(!prime[i])
prime[++prime[0]]=i;
for(int j=1; j<=prime[0] && prime[j]<=MAXN/i; j++)
{
prime[prime[j]*i]=1;
if(i%prime[j]==0)
break;
}
}
}
long long factor[100][2];
//factor[i][0]==P1; factor[i][1]==a1;
//其正因子个数为S=(1+a1)(1+a2)...(1+an)
int fatCnt;
int getFactors(long long x)
{
fatCnt=0;
long long tmp=x;
for(int i=1; prime[i]<=tmp/prime[i]; i++)
{
factor[fatCnt][1]=0;
if(tmp%prime[i]==0)
{
factor[fatCnt][0]=prime[i];
while(tmp%prime[i]==0)
{
factor[fatCnt][1]++;
tmp/=prime[i];
}
fatCnt++;
}
}
if(tmp!=1)
{
factor[fatCnt][0]=tmp;
factor[fatCnt++][1]=1;
}
return fatCnt;
}
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/71 (转载时请注明本文出处及文章链接)

发表评论
快来吐槽一下吧!