题目大意:给定\(n(1\leq n\leq500)\)个数\(a_1,a_2\cdots,a_n(1\leq a_i\leq2\cdot10^{18})\),每个数有\(3\sim5\)个因数,求\(\prod_{i=1}^{n}a_i\)的因数个数

这道题是一个交互题(虽说并不觉得有交互的必要...可能只是为了\(hack\)或者造数据方便吧),非常纯的数\((du)\)学\((liu)\),题目难度不在于结论,而在于代码实现

小学数学告诉我们以下结论:一个正整数\(x\)可以被分解成唯一形式\(x=p_{1}^{a_{1}}\cdot p_{2}^{a_{2}}\cdot \cdots \cdot p_{k}^{a_{k}}(p_i\text{为质数})\),\(x\)的因数个数为\(\prod_{i=1}^{k}(a_i+1)\).所以这道题的本质是质因数分解.

对于一个数\(x\)进行质因数分解最快的方式是枚举\(2\sim\sqrt{x}\)的质数\(p\)判断\(p\)是否能整除\(x\)进行分解,但是题目数据范围\(a_i\leq10^{18}\),如果要对\(a_i\)直接质因数分解需要枚举\(2\sim10^9\)内所有质数,若按照这种思路还需要预处理\(10^9\)内的质数表.

但是这样做并不可行,\(10^9\)内的质数表即使用线性筛也无法在\(1s\)和\(256M\)的限制内完成.此时注意到题目上还有未使用到的条件:每个数有\(3\sim5\)个因数.所以此题唯一的入手点就是这个具有奇特性质的条件.

考虑一个数\(x\)有\(3\sim5\)个因数可能的特殊性质,发现\(x\)有\((1)p_1\cdot p_2,(2)p_1^2,(3)p_1^3,(4)p_1^4\)四种可能的分解形式,对于\((2)(3)(4)\)三种分解形式,我们可以考虑二分求出\(p_1\)(\(cmath\)并不支持求\(\sqrt[3]{x},\sqrt[4]{x}\)),如果满足\((2)(3)(4)\)中任意一种分解,那么直接计数即可,如果三种分解形式都不满足,那么考虑对于\(p_1\cdot p_2\)形式的数的分解,如果\(p_1,p_2\)的次数都为\(1\)那么可以不分解这样的\(x\),直接乘\((cnt+1)^2\),如果\(p_1,p_2\)的次数有至少一个不为\(1\),那么对于\(x\)一定存在一个数\(y(y\neq x)\)使得\(gcd(x,y)>1\),此时的\(gcd(x,y)\)就是\(x,y\)的一个质因数,也即\(x,y\)都完成了质因数分解.至此所有可分解的数都完成了质因数分解,不可分解的数都满足两个质因数次数为\(1\),所以剩下的只需要求\(\prod_{i=1}^{k}(a_i+1)\)即可.

下面放\(AC\)代码\(\downarrow\downarrow\downarrow\)

#include<cstdio>//CF1033D
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map> using namespace std; const int MOD=998244353; int n; long long a[502]; map<long long,long long>mp,mmp; long long gcd(long long u,long long v){
if(v==0){
return u;
}
return gcd(v,u%v);
} long long bs2(long long l,long long r,long long u){
if(l==r){
return l;
}
long long mid=(l+r)>>1;
if(mid*mid<u){
return bs2(mid+1,r,u);
}
else{
return bs2(l,mid,u);
}
} long long bs3(long long l,long long r,long long u){
if(l==r){
return l;
}
long long mid=(l+r)>>1;
if(mid*mid*mid<u){
return bs3(mid+1,r,u);
}
else{
return bs3(l,mid,u);
}
} long long bs4(long long l,long long r,long long u){
if(l==r){
return l;
}
long long mid=(l+r)>>1;
if(mid*mid*mid*mid<u){
return bs4(mid+1,r,u);
}
else{
return bs4(l,mid,u);
}
} int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;i++){
long long rep;
rep=bs4(1,40000,a[i]);
if(rep*rep*rep*rep==a[i]){
mp[rep]+=4;
continue;
}
rep=bs3(1,1300000,a[i]);
if(rep*rep*rep==a[i]){
mp[rep]+=3;
continue;
}
rep=bs2(1,1500000000,a[i]);
if(rep*rep==a[i]){
mp[rep]+=2;
continue;
}
bool flag=false;
for(auto ite:mp){
if(a[i]%ite.first==0){
mp[ite.first]++;
mp[a[i]/ite.first]++;
flag=true;
break;
}
}
if(!flag){
for(auto ite2:mmp){
if(ite2.first==a[i]){
mmp[a[i]]++;
flag=true;
break;
}
long long g=gcd(a[i],ite2.first);
if(g>1){
mp[g]+=ite2.second+1;
mp[a[i]/g]++;
mp[ite2.first/g]+=ite2.second;
mmp[ite2.first]=0;
flag=true;
break;
}
}
if(!flag){
mmp[a[i]]++;
}
}
}
for(auto ite2:mmp){
for(auto ite:mp){
if(ite2.first%ite.first==0){
mp[ite.first]+=ite2.second;
mp[ite2.first/ite.first]+=ite2.second;
mmp[ite2.first]=0;
break;
}
}
}
long long ans=1;
for(auto ite:mp){
ans*=(ite.second+1);
ans%=MOD;
}
for(auto ite:mmp){
ans*=(ite.second+1);
ans%=MOD;
ans*=(ite.second+1);
ans%=MOD;
}
printf("%lld\n",ans);
fflush(stdout);
return 0;
}

Codeforces | CF1033D 【Divisors】的更多相关文章

  1. CodeForces 382C【模拟】

    活生生打成了大模拟... #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsig ...

  2. Codeforces 479【E】div3

    题目链接:http://codeforces.com/problemset/problem/977/E 题意:就是给你相连边,让你求图内有几个环. 题解:我图论很差,一般都不太会做图论的题.QAQ看官 ...

  3. Codeforces 479【F】div3

    题目链接:http://codeforces.com/problemset/problem/977/F 题意:给你一串数字序列,让你求最长上升子序列,但是这个子序列呢,它的数字得逐渐连续挨着. 题解: ...

  4. Codeforces 479【D】div3

    题目链接:http://codeforces.com/problemset/problem/977/D 题意:给你一个数字序列,定了一个游戏规则.你可以对当前数字进行两个操作 1./ 3  如果这个数 ...

  5. Codeforces 479【C】div3

    题目链接:http://codeforces.com/problemset/problem/977/C 题意:给你n个数字,输出任意一个数字,这个数字刚好大于等于,序列里面k个数字. 题解:排个序,第 ...

  6. Codeforces 479【B】div3

    题目链接: http://codeforces.com/problemset/problem/977/B 题意:字符串,找固定长度为2的重复子串出现次数最多的. 题解:我暴力做的.暴力出奇迹. #in ...

  7. Codeforces 479【A】div3试个水

    题目链接:http://codeforces.com/problemset/problem/977/A 题意:这个题,题目就是让你根据他的规律玩嘛.末尾是0就除10,不是就-1. 题解:题解即题意. ...

  8. Codeforces | CF1028C 【Rectangles】

    (这道题太简单啦...虽说我锤了一上午都没过...我能说这道题和\(CF1029C\)算是同一道题吗...) 按照时间顺序来说...\(CF1029\)在\(CF1028\)前面(而且\(CF1029 ...

  9. Codeforces | CF1010C 【Border】

    这道题大致题意是给定\(n\)个十进制整数和一个进制数\(k\),可以用无数多个给定的十进制整数,问这些十进制整数的和在模k意义下有多少种不同的结果(\(k\)进制下整数的最后一位就是这个数模\(k\ ...

随机推荐

  1. Telnet服务器和客户端请求处理

    Telnet服务器和客户端请求处理 本文的控制台项目是根据SuperSocket官方Telnet示例代码进行调试的,官方示例代码:Telnet示例. 开始我的第一个Telnet控制台项目之旅: 创建控 ...

  2. Django中CBV的执行顺序之源码解析

    浅析Django中的CBV的执行顺序 下图为CBV方式的执行顺序,大概执行流程如下: 其中浅蓝色为在假设自己写的类,即Test类中没有dispatch方法的情况下的执行顺序,当自己的类中有dispat ...

  3. Composer之搭建自己的包工具

    作为一个标准的PHPer,必须学会优雅的使用composer,最近,萌生了一个想法,我们每搭建一个项目,里面都会有许多的公用的方法和类库,每次使用的时候就是将其拷贝过来,或者重新写一遍,过于繁琐,效率 ...

  4. K8S集群 NOT READY的解决办法 1.13 错误信息:cni config uninitialized

    今天给同事 一个k8s 集群 出现not ready了 花了 40min 才搞定 这里记录一下 避免下载 再遇到了 不清楚. 错误现象:untime network not ready: Networ ...

  5. [转帖]Linux下fork函数及pthread函数的总结

    Linux下fork函数及pthread函数的总结 https://blog.csdn.net/wangdd_199326/article/details/76180514 fork Linux多进程 ...

  6. LLVM的安装

    1. 官网下载 llvm 2. 官网下载cmake 3. configure 执行 llvm 发现报错 4. 解压缩 cmake 5.将cmake 下面的bin 目录放到环境变量里面去 6. 创建一个 ...

  7. Oracle pivot行转列函数案例

    with temp as( select '湖北省' province,'武汉市' city,'第一' ranking from dual union all select '湖北省' provinc ...

  8. 微信小程序错误码参考大全

    开发过程中,会遇到很多微信返回的状态码,鬼知道代表什么意思,现在好了,整理总结了一份状态码,方便大家. 转载:http://www.yiyongtong.com/archives/view-1856- ...

  9. Jquery模拟多选框(checkbox)

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <tit ...

  10. vue.js实战——vue 实时时间

    created:实例创建完成后调用,此阶段完成了数据的观测等,但尚未挂载,$el还不可用,需要初始化处理一些数据时会比较有用. mounted:el挂载到实例上后调用,一般我们的第一个业务逻辑会在这里 ...