1033D - Divisors - CodeForces Solution


interactive math number theory *2000

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD=998244353;
ll sqr_2(ll l,ll r,ll x){
    while(l<=r){
        auto mid=l+r>>1;
        if(mid*mid<=x) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}
ll sqr_3(ll l,ll r,ll x){
    while(l<=r){
        auto mid=l+r>>1;
        if(mid*mid*mid<=x) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}
ll gcd(ll A,ll B){
    if(B==0) return A;
    return gcd(B,A%B);
}
ll sqr_4(ll l,ll r,ll x){
    while(l<=r){
        auto mid=l+r>>1;
        if(mid*mid*mid*mid<=x) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}
map<ll,ll>mp,mmp;
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        ll x;
        scanf("%lld",&x);
        auto tmp=sqr_4(1,40000,x);
        if(tmp*tmp*tmp*tmp==x){
            mp[tmp]+=4;
            continue;
        }
        tmp=sqr_3(1,1300000,x);
        if(tmp*tmp*tmp==x){
            mp[tmp]+=3;
            continue;
        }
        tmp=sqr_2(1,1500000000,x);
        if(tmp*tmp==x){
            mp[tmp]+=2;
            continue;
        }
        bool flag=0;
        for(auto it:mp){
            if(x%it.first==0){
                mp[it.first]++;
                mp[x/it.first]++;
                flag=1;
                break;
            }
        }
        if(flag) continue;
        for(auto it:mmp){
            if(it.first==x){
                mmp[x]++;
                flag=1;
                break;
            }
            ll g=gcd(it.first,x);
            if(g==1) continue;
            mp[g]+=mmp[it.first]+1;
            mp[it.first/g]+=mmp[it.first];
            mp[x/g]++;
            mmp[it.first]=0;
            flag=1;
            break;
        }
        if(!flag) mmp[x]++;
    }
    for(auto it1:mmp){
        for(auto it2:mp){
            if(it1.first%it2.first==0){
                mp[it2.first]+=it1.second;
                mp[it1.first/it2.first]+=it1.second;
                mmp[it1.first]=0;
                break;
            }
        }
    }
    ll ans=1;
    for(auto it:mp){
        // cout<<it.first<<"  "<<it.second<<endl;
        ans=(ans*(it.second+1))%MOD;
    }
    for(auto it:mmp){
        ans=(ans*(it.second+1))%MOD;
        ans=(ans*(it.second+1))%MOD;
    }
    printf("%lld\n",ans);
    return 0;
}
	  		 	  		         		  	   	


Comments

Submit
0 Comments
More Questions

749A - Bachgold Problem
1486B - Eastern Exhibition
1363A - Odd Selection
131B - Opposites Attract
490C - Hacking Cypher
158B - Taxi
41C - Email address
1373D - Maximum Sum on Even Positions
1574C - Slay the Dragon
621A - Wet Shark and Odd and Even
1395A - Boboniu Likes to Color Balls
1637C - Andrew and Stones
1334B - Middle Class
260C - Balls and Boxes
1554A - Cherry
11B - Jumping Jack
716A - Crazy Computer
644A - Parliament of Berland
1657C - Bracket Sequence Deletion
1657B - XY Sequence
1009A - Game Shopping
1657A - Integer Moves
230B - T-primes
630A - Again Twenty Five
1234D - Distinct Characters Queries
1183A - Nearest Interesting Number
1009E - Intercity Travelling
1637B - MEX and Array
224A - Parallelepiped
964A - Splits