题意: 给定
,求出
的数对个数。其中
。
数据范围:
题解: 对于一个数
,分解质因数后得到:
那么对于
- 对于 以内的数, ,所以对于 都有 种选择,不过注意当两者同取最大幂时,该幂只能被取一次,所以共 次。
- 其次,由于 ,而由于最大幂只能取一次,所以 只出现一次,其余均出现了 次。故最后答案是
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
int pri[N / 10], cnt;
bool st[N];
void xs(int n) {
st[0] = st[1] = true;
for(int i = 2; i <= n; ++i) {
if(!st[i]) pri[++cnt] = i;
for(int j = 1; j <= cnt && 1ll * i * pri[j] <= n; ++j) {
st[i * pri[j]] = true;
if(i % pri[j] == 0) break;
}
}
}
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
long long pairsFormLCM( int n ) {
long long res = 0;
for( int i = 1; i <= n; i++ )
for( int j = i; j <= n; j++ )
if( lcm(i, j) == n ) printf("#(%d, %d\n)", i, j), res++; // lcm means least common multiple
return res;
}
int main()
{
xs(N - 1);
int T; scanf("%d", &T);
for(int k = 1; k <= T; ++k) {
ll n; scanf("%lld", &n);
ll res = 1;
for(int j = 1; j <= cnt && 1ll * pri[j] * pri[j] <= n; ++j) {
if(n % pri[j] == 0) {
int temp = 0;
while(n % pri[j] == 0) n /= pri[j], ++temp;
res *= (2 * temp + 1);
}
}
if(n > 1) res *= (2 * 1 + 1);
res = res / 2 + 1;
printf("Case %d: %lld\n", k, res);
}
}