数论,质因数,gcd——cf1033D 好题!

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数论,质因数,gcd——cf1033D 好题!相关的知识,希望对你有一定的参考价值。

直接筛质数肯定是不行的

用map<ll,ll>来保存质因子的指数

考虑只有3-5个因子的数的组成情况

必定是a=pq or a=p*p or a=p*p*p or a=p*p*p*p

先用二分判后面三种情况

然后判第一种情况

由于不知道pq,而且无法直接求,我们间接用 d=gcd(a[i],a[j]) 来求

如果1<d<a[i],那么a[i]两个因数就可以确定是d,a[i]/d

反之a[i]两个因数未出现过,pq直接计算到贡献里去

但是可能有和a[i]相等的数,所以我们不先计算这样pq的数量,而是另外开一个map<ll,ll>来计算像a[i]这样的不能直接求出因子的数及其个数

然后求答案时再和另一个map分开统计,相乘

#include<bits/stdc++.h>
#include<map>
using namespace std;
#define ll long long
#define mod 998244353
map<ll,ll>mp;
map<ll,ll>::iterator it;
int n,tot;
ll a[505];
ll calc4(ll x){
    ll l=1,r=37607,mid;
    while(l<=r){
        mid=l+r>>1;
        ll t=mid*mid*mid*mid;
        if(t==x)return mid;
        else if(t>x)r=mid-1;
        else l=mid+1;
    }
    return -1;
}
ll calc3(ll x){
    ll l=1,r=1259922,mid;
    while(l<=r){
        mid=l+r>>1;
        ll t=mid*mid*mid;
        if(t==x)return mid;
        else if(t>x)r=mid-1;
        else l=mid+1;
    }
    return -1;
}
ll calc2(ll x){
    ll l=1,r=1414213563,mid;
    while(l<=r){
        mid=l+r>>1;
        ll t=mid*mid;
        if(t==x)return mid;
        else if(t>x)r=mid-1;
        else l=mid+1;
    }
    return -1;
}
map<ll,ll>has;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++){
        ll p=calc4(a[i]);
        if(p!=-1){mp[p]+=4;continue;}
        p=calc3(a[i]);
        if(p!=-1){mp[p]+=3;continue;}
        p=calc2(a[i]);
        if(p!=-1){mp[p]+=2;continue;}
        
        int flag=0;
        for(int j=1;j<=n;j++){//找p
            if(i==j)continue;
            ll d=__gcd(a[i],a[j]);
            if(d!=1 && d!=a[j]){
                mp[d]++;mp[a[i]/d]++;
                flag=1;break;
            }
        }
        if(flag==0)has[a[i]]++;//找不到p,就把a[i]存下来 
    }
    ll ans=1;
    for(it=has.begin();it!=has.end();it++){//计算第二个map的贡献 
        ans=ans*(it->second+1)%mod*(it->second+1)%mod;
    }
    for(it=mp.begin();it!=mp.end();it++){//计算第一个map的贡献 
        ans=ans*(it->second+1)%mod;
    }
    cout<<ans<<endl;
} 

 

以上是关于数论,质因数,gcd——cf1033D 好题!的主要内容,如果未能解决你的问题,请参考以下文章

CF633B

『数论』求最大公因数

CodeForces 1047C Enlarge GCD(数论)题解

POJ2773Happy2006题解--数论好题

LeetCode数论题目总结

[CF664A]Complicated GCD(数论)