lightOJ 1236 Pairs Forming LCM(算术基本定理)

来源:互联网 发布:化工仿真软件csts 编辑:程序博客网 时间:2024/05/22 02:02
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;}


0 0
原创粉丝点击