码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-05-01 17:21:14      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:lag   names   lse   无法   mod   fine   pre   c++   alc   

直接筛质数肯定是不行的

用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 好题!

标签:lag   names   lse   无法   mod   fine   pre   c++   alc   

原文地址:https://www.cnblogs.com/zsben991126/p/10800193.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!