首页 > 其他分享 >[ABC114D] 756 题解

[ABC114D] 756 题解

时间:2023-06-15 21:13:17浏览次数:52  
标签:24 756 题解 sum ts 因数 75 ABC114D 质因数

题目链接

题意

给定一个数 \(n\),求 \(n!\) 的因数中,刚好有 \(75\) 个因数的数的个数。

分析

首先有这样一个性质,对于一个数 \(a\),我们将其分解质因数,即

\[a = \prod_{i = 1}^{n} p_i^{k_i} \]

那么,\(a\) 的因数个数就是

\[sum = \prod_{i = 1}^{n} (k_i+1) \]

简单证明一下,对于第 \(i\) 个质因数,可以选 \([0, k_i]\) 个,所以最终能组合出来的不同因数就是 \(sum\) 个。

题干要求因数个数为 \(75\) 的因数,首先考虑什么样的数有 \(75\) 个因数——没错,我们将 \(75\) 分解因数,发现

\(75 = 5 \times 5 \times 3\),则 ​$a= p_1^4 p_2^4 p_3^2 $;

同理,

\(75 = 5 \times 15\),$a= p_1^{4} p_2^{14} $

\(75 = 25 \times 3\),$a= p_1^{24} p_2^2 $

\(75 = 75 \times 1\),$a= p_1^{74} $

因为 \(n!\) 的质因数包括了其所有因数的质因数,而每种质因数组合只能确定一个数,故我们可以直接考虑每种情况如何构造出 \(a\)。我们令 \(s_i\) 表示,个数大于等于 \(i\) 的质因数个数。因为多余的数没有用,所以这里我们直接考虑大于等于的数。

那么,对于第一种情况,对答案的贡献为 \(C_{s_4}^2*(s_2-2)\);

同理,第二种的贡献 \(s_{14}*(s_{4}-1)\);

第三种的贡献 \(s_{24}*(s_2-1)\);

第四种的贡献 \(s_{75}\)。

最后看数据范围。 \(n\) 说小不小,\(100!\) 肯定不是直接求出来;然后 \(n\) 又说大不大,可以考虑对 \(1\) 到 \(n\) 的数分解质因数,那么 \(n!\) 的质因数分解就是对 \([1, n]\) 的数的质因数的指数做前缀和。最后的答案就是将以上四种贡献加起来。

#include<bits/stdc++.h>
using namespace std;
const int N = 305;
int n;
int a[105][105];
bool vis[105];
int pr[105], tot;
void init(){
	for(int i = 2; i<=100; i++){
		if(vis[i]) continue;
		vis[i] = 1, pr[++tot] = i;
		for(int j = i; j<=100; j+=i){
			vis[j] = 1;
		}
	}//数据范围很小很小所以简单筛一下质数就行。
	for(int i = 2; i<=100; i++){
		int tmp = i;
		for(int j = 1; j<=tot; j++){
			if(tmp%pr[j] == 0){
				while(tmp%pr[j] == 0){
					tmp/=pr[j];
					a[i][j]++;//对1~100内的数分解质因数。
				}
			}
		}
	}
}
int f[N];
int sum[N]; 
int ts[N];
int main(){
	scanf("%d", &n);
	init();
	for(int i = 1; i<=n; i++){
		for(int j = 1; j<=tot; j++){
			sum[j]+=a[i][j];//求n!因数分解后质因数的指数。
		}
	}
	int ans = 0;
	int L = 0, R = 0, Y = 0;
	sort(sum+1, sum+1+tot, greater<int>());
	for(int i = 1; i<=tot; i++){
		if(sum[i]>=24){
			ts[24]++;
		}
		if(sum[i]>=14){
			ts[14]++;
		}
		if(sum[i]>=74){
			ts[74]++;
		}
		if(sum[i]>=4){
			ts[4]++;
		}
		if(sum[i]>=2){
			ts[2]++;
		}
	} 
	if(ts[74]){
		ans+=ts[74];
	}
	if(ts[24]){
		ans+=ts[24]*(ts[2]-1);
	}
	if(ts[14]){
		ans+=(ts[14]*(ts[4]-1));
	}
	if(ts[4]){
		ans+=(ts[4]*(ts[4]-1)/2*(ts[2]-2));
	}

	printf("%d\n", ans);
	return 0;
}

标签:24,756,题解,sum,ts,因数,75,ABC114D,质因数
From: https://www.cnblogs.com/frostwood/p/17484110.html

相关文章

  • Alien 的排列题解
    Description求出有多少\(2\simn+1\)的排列\(\{P_{n}\}\),使得对于所有\(1\leqi\leqn\)有\(i|P_{i}\)。对于\(30\%\)的数据\(n\leq10\)。对于\(90\%\)的数据\(n\leq3000\)。对于\(100\%\)的数据\(n\leq10^9\)。Solution如果把\(n+1\)固定在第\(1\)个......
  • 问题解决sql文件上传和蚁剑连接
    1.无法连接上自己的ip:发现问题是上传的木马不在127.0.0.1的文件下时,会导致解析不到木马,要将木马上传到127.0.0.1的文件下连接2.解决sql上传一句话木马问题要先在mysql的配置文件my.ini中添加导入导出数据库的地址:secure_file_priv=D:\phpstudy_pro\WWW然后重启数据库,可以进行sq......
  • [ZJOI2022] 深搜 题解
    题目描述九条可怜是一个喜欢算法的女孩子,在众多算法中她尤其喜欢深度优先搜索(DFS)。有一天,可怜得到了一棵有根树,树根为\(\mathit{root}\),树上每个节点\(x\)有一个权值\(a_x\)。在一棵树上从\(x\)出发,寻找\(y\)节点,如果使用深度优先搜索,则可描述为以下演算过程:将递归栈......
  • 关于display:flex;justify-content: space-between;的最后一个元素无法左对齐的问题解
    1.问题:当使用v-for遍历一个数组,当数字长度不是要进行左右对齐的数字的倍数*(以3为例),无法进行左对齐的问题 解决方法:1.使用watch监听这个数组的长度的变化,判断这个数组的长度是否3%2是不是等于0,如果是为则这个数字追加一个空对象,代码如下:watch:{rowsForm:{......
  • [问题解决]:ImportError: /home/test/anaconda3/envs/py39/bin/../lib/libstdc++.so.6
    报错(py39)test@test:~/code/Face/test_speed$pythonface_yaw_pitc_roll.pyTraceback(mostrecentcalllast):File"/home/test/code/Face/test_speed/face_yaw_pitc_roll.py",line17,in<module>importdlibFile"/home/test/anacon......
  • P2801 教主的魔法 题解
    一、题目描述:给你一个长度为$n$的序列$a$,你需要进行$m$次操作。$类型\1\:将区间\l\到\r\的数加\x\。$$类型\2\:求区间\l\到\r\中有多少个数大于等于\x\。$数据范围:$1\len\le1\times10^6,m\le3\times10^3$ 二、解题思路:......
  • JAVA面试题解惑系列(八)——聊聊基本类型(内置类型)
    关键字:java面试题基本类型intlongbooleanfloatdoublechar作者:臧圩人(zangweiren)基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一......
  • JAVA面试题解惑系列(四)——final、finally和finalize的区别
    关键字:java面试题finalfinallyfinalize作者:臧圩人(zangweiren)final、finally和finalize的区别是什么?这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是......
  • AtCoder Beginner Contest 305 题解 A - F
    A-WaterStation题目大意找到离给定的数最近的一个\(5\)的倍数输出即可。解题思路我们取这个数对\(5\)的上下界,也就是整数除以\(5\)再乘以\(5\),以及这个数再加上一个\(5\),比较这两数和给定数的距离即可。ACCode#include<iostream>#include<algorithm>#includ......
  • 题解 ABC207F【Tree Patrolling】
    挺简单的树上背包,就是有点难写。设\({dp}_{u,i,x,y}\)表示仅考虑\(u\)的子树内,有\(i\)个节点被控制,\(x\)为节点\(u\)是否有警卫,\(y\)为节点\(u\)是否被控制。(其实所有\(x=1,y=0\)的状态都没用,但我懒得管了。)每个点\(u\)的初始值为\({dp}_{u,0,0,0}={dp}_{u,1,1......