QOJ.ac

QOJ

IDSubmission IDProblemHackerOwnerResultSubmit timeJudge time
#1098#692517#9248. An Easy Math ProblemCore_65536Core_65536Success!2024-10-31 22:36:292024-10-31 22:36:30

Details

Extra Test:

Time Limit Exceeded

input:

2000
10000000000
9999980000
9999960000
9999940000
9999920000
9999900000
9999880000
9999860000
9999840000
9999820000
9999800000
9999780000
9999760000
9999740000
9999720000
9999700000
9999680000
9999660000
9999640000
9999620000
9999600000
9999580000
9999560000
9999540000
9999520000
9999500000
99994800...

output:


result:


IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#692517#9248. An Easy Math ProblemCore_65536#TL 77ms5472kbC++231.9kb2024-10-31 14:39:012024-10-31 22:43:15

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
#define int long long
vector<int>ans;
vector<__int128>res;
unordered_map<int,int>mp;

void dfs(int i,__int128 res1)
{
    if(i==ans.size())
    {
        // cout<<res1<<"\n";
        res.push_back(res1);
        return ;
    }

    for(int j=0;j<=mp[ans[i]];j++)
    {
        int j1=j;
        while(j1--) res1*=ans[i];
        dfs(i+1,res1);
        j1=j;
        while(j1--) res1/=ans[i];
    }
}
// bool is[100000010];
// vector<int>pr;
// void init()
// {
//     for(int i=2;i<=1e8;i++)
//     {
//         if(!is[i]) pr.push_back(i);
//         for(int j=0;j<pr.size()&&pr[j]*i<=1e8;j++)
//         {
//             is[pr[j]*i]=1;
//             if(i%pr[j]==0) break;
//         }
//     }
// }

map<int,int>mp1;
void solve()
{
    int n;
    cin>>n;
    if(mp1.count(n)) 
    {
        cout<<mp1[n]<<"\n";
        return ;
    }
    int tn=n;
    if(n==1)
    {
        cout<<"1\n";
        return ;
    }
    mp.clear();
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            while(n%i==0)
            {
                n/=i;
                mp[i]++;
            }
        }
    }
    if(n!=1) mp[n]++;

    ans.clear();
    res.clear();
    

    for(auto i:mp) ans.push_back(i.first);
    


    dfs(0,1);
    
    sort(res.begin(),res.end());

    set<pair<int,int>>st;
    for(int i=0;i<res.size();i++)
    {
        for(int j=i;j<res.size();j++)
        {
            if(res[i]*res[j]>tn) break;

            if(tn%(res[i]*res[j])==0)
            {
                int g=__gcd(res[i],res[j]);
                st.insert({res[i]/g,res[j]/g});
            }
        }
    }
    mp1[tn]=st.size();
    cout<<st.size()<<"\n";
}

signed main ()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}