1236 - Pairs Forming LCM -- LightOj1236 (LCM)

时间:2023-03-08 19:06:34
1236 - Pairs Forming LCM -- LightOj1236 (LCM)

http://lightoj.com/volume_showproblem.php?problem=1236

题目大意: 给你一个数n,让你求1到n之间的数(a,b && a<=b)两个数的最小公倍数等于n有多少对这样的ab.

1236 - Pairs Forming LCM -- LightOj1236 (LCM)

分析都写在图片上了,费了我好大的事呢

ac代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue> using namespace std;
typedef long long LL;
#define N 10010001
#define ESP 1e-8
#define INF 0x3f3f3f3f
#define memset(a,b) memset(a,b,sizeof(a)) LL prime[], k;
bool vis[N]; void Prime()
{
memset(vis, false);
k = ;
for(int i=; i<N; i++)
{
if(vis[i] == )
{
prime[k ++] = i;
for(int j= i+i; j<N; j+=i)
{
vis[j] = ;
}
}
}
} LL solve(LL n)
{
LL ans, sum;
ans = ;
sum = ;
for(int i=; prime[i] * prime[i] <= n; i++)
{
if(n%prime[i] == )
{
ans=;
while(n%prime[i] == )
{
ans ++;
n /= prime[i];
}
sum *= (*ans+);
}
}
if(n>)
sum *= (* + );
return sum;
} int main()
{
int T, t=;
LL n;
Prime();
scanf("%d", &T);
while(T --)
{
LL n;
scanf("%lld", &n); LL sum = solve(n); printf("Case %d: %lld\n", t++, sum/+);
}
return ;
}