X-factor Chain(信息学奥赛一本通 1628)
题目描述
输入正整数 x,求 x 的大于 1 的因子组成的满足任意前一项都能整除后一项的序列的最大长度,以及满足最大长度的序列的个数。
输入
多组数据,每组数据一行,包含一个正整数 x。
对于全部数据,1≤x≤220。
输出
对于每组数据,输出序列的最大长度以及满足最大长度的序列的个数。
样例输入
2
3
4
10
100
样例输出
1 1
1 1
2 1
2 2
4 6
这道题虽然是“约数”的练习,但其实我一开始一点关于约数的思路都没,后来去网上看别人的题解,然鹅基本上都是肥肠简单的一笔带过(类似“不难得到”“易得”之类的话),直接得出“序列的最大长度即x的质因子的总个数,而满足最大长度的序列的个数即x的所有质因子的全排列数”的结论,对于我这样的蒟蒻来说太不友善惹,我都看得一脸懵逼o((⊙﹏⊙))o
后来终于找到了这位大佬的题解↓↓↓,写的真是思路清晰,让我一下子恍然大悟。
点击进入大佬的博客
简要分析下这道题的题意:要使这个序列中的前一项都能整除后一项,即前一项必须是后一项的因子。我们设前一项为a,后一项为a*n,那么要使这个序列尽可能的长,就要让n尽可能的小,小到不能再进行分解,(假如n可以分解,即n=p*q,且p、q都不等于1,那一定可以让这个序列变成更长的a,a*p,a*p*q,那么就不符题意了),那显然n不就是质数嘛,而a可以乘的n的个数就是我们要求的序列的最大长度。所以我们就可以将给定的x分解质因数,统计x一共有多少个质因子(我这里记为ans)。
其实完全可以将这个最长序列的每一项都看成是它的前一项所乘的质数(第一项的前一项可看作是1),那么这样,满足最大长度的序列个数,就是这些质数的不同排列方式的个数,即组合数学当中的“不全相异元素的排列”。所以排列数公式为:ans!/(c1!+c2!......+ck!)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=;
int c[];
ll f[N];
ll fac(ll x)
{
if(f[x])return f[x];//记忆化搜索
f[x]=x*fac(x-);
return f[x];
}
int main()
{
ll x;f[]=;
while(~scanf("%lld",&x))
{
ll cnt=,ans=;//每次都要更新
memset(c,,sizeof(c));
ll n=x;
for(ll i=;i*i<=x;i++)
{
if(n%i==)
{
cnt++;//cnt存x可分解出的质因子的种数
while(n%i==)
{
n/=i;
c[cnt]++;//第几种质因子在x里出现的个数
ans++;//ans指x里一共有多少个质因子
}
}
}
if(n>)//如果还有一个大于sqrt(n)的质数
{
c[++cnt]++;
ans++;
}
printf("%lld ",ans);
ll nn=fac(ans);//nn=ans!
for(int i=;i<=cnt;i++)
nn/=fac(c[i]);
printf("%lld\n",nn);
}
return ;
}
详情请展开代码
现在觉得其实很简单的鸭,没有一点技巧,真搞不懂我之前居然没理解,看来是脑子没转过弯来。果然写一遍题解还是有点用的
X-factor Chain(信息学奥赛一本通 1628)的更多相关文章
- $ybt\ 【信息学奥赛一本通】题解目录$
[信息学奥赛一本通]题解目录 $ \large -> OJ$ $ problem1000 $ \(Answer\) - > $ \large 1000$ $ problem1001 $ \ ...
- 2019寒假练题计划——LibreOJ刷题计划 &《信息学奥赛一本通》提高版题目
目录 2019.1.27 #10082. 「一本通 3.3 例 1」Word Rings 题意 思路 #10083. 「一本通 3.3 例 2」双调路径 题意 思路 #10084. 「一本通 3.3 ...
- 【信息学奥赛一本通】第三部分_队列 ex2_3produce 产生数
给出一个整数n(n<=2000)(代码可适用n<=10^31)和k个变换规则(k<=15). 规则:1.1个数字可以变换成另1个数字: 2.规则中右边的数字不能为零. BFS #in ...
- 信息学奥赛一本通算法(C++版)基础算法:高精度计算
高精度加法(大位相加) #include <bits/stdc++.h> using namespace std; int main() { ],b1[]; ],b[],c[];//a,b ...
- 食物链【NOI2001】(信息学奥赛一本通 1390)
[题目描述] 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种 ...
- Biorhythms(信息学奥赛一本通 1639)
题目描述: 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏 ...
- 信息学奥赛一本通 提高篇 序列第k个数 及 快速幂
我是传送门 这个题首先是先判断是等差还是等比数列 等差的话非常简单: 前后两个数是等差的,举个栗子: 3 6 9 12 这几个数,(我感觉 1 2 3 4并说明不了什么) 每次都加3嘛,很容易看出,第 ...
- 【NOI2002】荒岛野人(信息学奥赛一本通 1637)(洛谷 2421)
题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...
- 【09NOIP提高组】Hankson 的趣味题(信息学奥赛一本通 1856)(洛谷 1072)
题目描述 Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在课堂上,老师讲解了如何求 ...
随机推荐
- expor和import的用法
1.Export 模块是独立的文件,该文件内部的所有的变量外部都无法获取.如果希望获取某个变量,必须通过export输出 // profile.js export var firstName = 'M ...
- 英语rubyspinel红尖晶石rubyspinel单词
红尖晶石(rubyspinel或Red spinel)其红色是因含铬而致^像红宝石和红色石榴子石一样,红 尖晶石也曾被叫作红玉,这就造成了红色宝石的混乱,因为世界上一些最大的著名“红宝 石”,如英国王 ...
- CSS 基础样式
文本 p{ font-family:Cambria, "Hoefler Text", "Liberation Serif", Times, "Time ...
- MongoDB的集群模式--Replica Set
一.Replica Set 集群分为两种架构: 奇数个节点构成Replica Set,所有节点拥有数据集.最小架构: 1个Primary节点,2个Secondary节点 偶数个节点 + 一个仲裁节点 ...
- 让window10目录支持大小写
今天用vmware影响文件夹以供linux系统使用,结果宿主机是win10系统,所以用在linux里,大小写变得不敏感. 解决办法也很简单. 管理员模式运行cmd(默认目录是C:\Windows\Sy ...
- 修改pyechart生成的HTML内容大小方法
1.目前安装pyechart后生成的图片默认大小为 width=800, height=400, 如图 2.想修改内容大小:找到C:\python\Lib\site-packages\pyechart ...
- CC2530 light_switch分析
一些关键字: CCM - Counter with CBC-MAC (mode ofoperation) HAL - HardwareAbstraction Layer (硬件抽象层) ...
- Centos6.5基于GPT格式磁盘分区
1.查看分区 fdisk -l 2.设置分区类型未gpt格式. parted -s /dev/sdb mklabel gpt 3.基于ext3文件系统类型格式化. mkfs.ext3 /dev/sdb ...
- python导入模块被加横线
2018-07-03 04:20:41 bluelilyfly 阅读数 1238 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...
- sklearn---DBSCAN
参考文献: [1]用scikit-learn学习DBSCAN聚类