题目大意:给一个n,求1到n里有多少对a,b满足a,b的最小公倍数是n。
网上找了个证明,写的比较清楚明白。
![](https://i-blog.csdnimg.cn/blog_migrate/8e22451f4d068fdfad08b47a4b3e98ee.png)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <stdio.h>
using namespace std;
const int maxn = 1e7+10;
typedef long long ll;
ll T,N;
ll P[1000010],tail; //1e7之前只有不到1e6的质数,所以这里1e6的空间就够了
bool vis[maxn];//判断是否是质数需要1e7的空间
void init(){
ll len = (ll)sqrt(maxn)+1;
for(int i = 2;i<=len;i++){
if(!vis[i]){
for(int j = i*i;j<maxn;j+=i){
vis[j] = true;
}
}
}
for(int i = 2;i<maxn;i++){
if(!vis[i]) P[tail++] = i;
}
}
ll solve(ll x){
ll sum = 1;
for(int i = 0;i<tail && P[i]*P[i]<=x;i++){
if(x%P[i] == 0){
int cnt = 0;
while(x%P[i] == 0){
cnt++;
x/=P[i];
}
sum *= 2*(cnt+1)-1;
}
}
if(x>1) sum *= 2*(1+1)-1;
return sum/2+1;
}
int main(){
init();
cin>>T;
int kase = 0;
while(T--){
scanf("%lld",&N);
printf("Case %d: %lld\n",++kase,solve(N));
}
return 0;
}