light1236 素数打表,质因数分解

不知道为什么会错

/*
求出 lcm(i,j)==n 的对数,
分解质因数,p1^e1 * p2^e2 * p3^e3 那么 i,j中必定有一个数有e1个p1因子,另一个任意即可 
那么最终的结果就是 
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 10000005
#define ll long long
ll n;

int v[maxn];
int prime[maxn],m;
void init(){
    memset(v,0,sizeof v);
    memset(prime,0,sizeof prime);
    m=0;
    for(int i=2;i<maxn;i++){
        if(v[i]==0){
            v[i]=i;
            prime[++m]=i;
        }
        for(int j=1;j<=m;j++){
            if(prime[j]>v[i] || prime[j]*i>n) break;
            v[i*prime[j]]=prime[j];
        }
    }
}
int p[maxn],c[maxn],mm;
void divide(ll n){
    memset(p,0,sizeof p);
    memset(c,0,sizeof c);
    mm=0;
    for(int i=1;i<=m;i++){
        if(prime[i]>n)break;
        if(n%prime[i]==0){
            p[++mm]=prime[i],c[mm]=0;
            while(n%prime[i]==0)n/=prime[i],c[mm]++;
        }
    }
    if(n>1)p[++mm]=n,c[mm]=1;
}


int main(){
    init();
    int T;
    cin>>T;
    for(int tt=1;tt<=T;tt++){
        cin>>n;
        divide(n);
        ll res=1;
        for(int i=1;i<=mm;i++)
            res*=(ll)(2*c[i]+1);
        printf("Case %d: %lld
",tt,res+1>>1);
    }
    


}

这是网上的ac代码

#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
#include <map>
#include <vector>
#include <algorithm>
#include <cstring>
#include <string>
using namespace std;
#define LL long long
#define maxn 10000001
bool v[maxn];
vector<int>prime;
void p(){
    memset(v,false,sizeof(v));
    for(int i=2;i<=maxn;i++){
        if(v[i])continue;
        for(int j=i+i;j<=maxn;j+=i){
            v[j]=true;
        }
        if(!v[i]) prime.push_back(i);
    }
}
int main()
{
    int t,ca=1;
    LL n,ans;
    p();
    scanf("%d",&t);
    while(t--){
        ans=1;
        scanf("%lld",&n);
        for(int i=0;i<prime.size()&&n>1;i++){
            if(n%prime[i]==0){
                LL s=0;
                while(n%prime[i]==0){
                    s++;
                    n/=prime[i];
                }
                ans*=(s*2+1);
            }
        }
        if(n>1){
            ans*=3;
        }
        printf("Case %d: %lld
",ca++,(ans+1)/2);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zsben991126/p/10403748.html