lightOJ 1236 Pairs Forming LCM
大意:求解N内的lcm(i,j)=N的对数(i,j)。 (a,b)和(b,a)算一对
分析:
做此题时,注意存储素因子的数组长度设置问题。我用1e7的int数组不断MLE,换成vector才解决了内存问题。(用C写,居然判我bool型错误,我不知所云。一共交了差不多20遍。)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N=1e7+5;
typedef long long LL;
bool vis[N];
vector<int> prim;
void getprim(){
for(int i=2;i<N;i++){
if(!vis[i]) prim.push_back(i);
int cnt=prim.size();
for(int j=0;j<cnt && i*prim[j]<N;j++){
vis[i*prim[j]]=1;
if(i%prim[j]==0) break;
}
}
}
int main()
{
//freopen("cin.txt","r",stdin);
int T;
int ca=1;
LL n;
getprim();
cin>>T;
int cnt=prim.size();
while(T--){
scanf("%lld",&n);
LL ans=1;
for(int i=0;i<cnt&&prim[i]<=n;i++){
if(n%prim[i]==0){
LL s=0;
while(n%prim[i]==0) {
n/=prim[i];
s++;
}
ans=ans*(2*s+1);
}
}
if(n>1) {
ans=ans*(2*1+1);
}
ans++; // n and n counts or 1/2-->0
ans>>=1;
printf("Case %d: %lld\n",ca++,ans);
}
return 0;
}