题目大意:给定\(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. Django restful 规范

    一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...

  2. python 实现快速排序

    一.快排思想 快速排序可以理解为是对冒泡排序的一种改进,把一组数,按照初始选定的标杆(参照数), 分别从两端开始排序,左端'i'只要小于标杆(参照数)的数,右端'j'只要大于标杆(参照数)的数, i- ...

  3. Windows之PowerShell使用命令

    Windows之PowerShell使用命令 切换 命令格式: cd [option] 切换到上一级目录 cd ../ 或者 cd .. 不同磁盘之间切换 盘符: 清屏 清空当前窗口的内容 cls 查 ...

  4. Golang的类型断言

    类型断言即判断一个变量是不是某个类型的实例,这个经常用在判断接口的类型,基本的格式: y, ok := x.(type) 上面的语句用于判断变量x是不是type类型,有两种结果: x是type类型的变 ...

  5. PAT L2-016 愿天下有情人都是失散多年的兄妹

    https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 呵呵.大家都知道五服以内不得通婚,即两个人最 ...

  6. Proper usage of Java -D command-line parameters

    https://stackoverflow.com/questions/5045608/proper-usage-of-java-d-command-line-parameters https://c ...

  7. VS2008引入头文件包含目录和lib库目录

    全局级别的引入 为VS所有项目设置包含目录和库目录,对所有项目都有效 如下图所示:工具-选项-项目和解决方案-VC++目录-包含文件:在此添加头文件目录即可 工具-选项-项目和解决方案-VC++目录- ...

  8. HTML5开发之meta标签的viewport使用说明

    随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移动互联应用开发也越来越受到人们的重视,用html5开发移动应用是最好的选择.然而每一款手机有不同的分辨率,不同屏幕大 ...

  9. 对C#调用C++的dll的一点思考

    最近在对接C++程序的时候碰到了一些问题,然后花了一段时间才解决,今天就这些小问题来做一个总结,很多时候由于对另外一种开发语言的不熟悉,会在使用的过程中遇到很多的问题,这些问题看似简单但是背后却有很多 ...

  10. java 环境变量配置 详解!

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...