济南学习D3T1__线性筛和阶乘质因数分解
【问题描述】
从1− N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少。
【输入格式】
第一行一个数字N。
【输出格式】
一行,一个整数代表答案对100000007取模之后的答案。
【样例输入】
7
【样例输出】
144
【样例解释】
但是塔外面有东西。
【数据规模与约定】
对于20%的数据,1<=N<=100。
对于50%的数据,1<=N<=5000。
对于70%的数据,1<=N<=10^5。
对于100%的数据,1<=N<=5*10^6。
________________________________________________________________
这个题并没有太好的办法,后来看了题解,才知道对N的阶乘进行质因数分解。于是用了筛法和快速幂,可是超时,只过了60分。于是学习了线性快速幂,时间少了,可还是60分,没解决根本问题。后来看了阶乘的质因数分解,很神奇!!!
将这个神奇的东西做一下介绍(引自网络):
求m!分解质因数后因子n的个数。
这道题涉及到了大数问题,如果相乘直接求的话会超出数据类型的范围。
下面给出一种效率比较高的算法,我们一步一步来。
m!=1*2*3*……*(m-2)*(m-1)*m
可以表示成所有和n倍数有关的乘积再乘以其他和n没有关系的
=(n*2n*3n*......*kn)*ohter other是不含n因子的数的乘积因为kn<=m 而k肯定是最大值所以k=m/n
=n^k*(1*2*......*k)*other
=n^k*k!*other
从这个表达式中可以提取出k个n,然后按照相同的方法循环下去可以求出k!中因子n的个数。
每次求出n的个数的和就是m!中因子n的总个数。
我的理解:
1、m!=1*2*3*……*m,里面肯定有n的整数倍,也就是1*2*……n……2*n……3*n……k*n……m;
2、里面有几个n的倍数就在M!中有几个n,于是m/n个;
3、可是还有些特殊情况,如n*n,n*n*n,这样在m/n的得数中再除n,再除n,再除n,……知道为0;
关于线性筛法要注意:
if(i%ss[j]==0)break;
__________________________________________________________________
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<algorithm>
5 #include<cmath>
6 using namespace std;
7 const int m=5000001;
8 const int md=100000007;
9 int n,js=0;
10 long long ans=1;
11 long long sz[m],ss[m],cs[m];
12 void sss()//线性筛法
13 {
14 memset(sz,-1,sizeof(sz));
15 for(int i=2;i<m;i++)
16 {
17 if(sz[i])ss[js++]=i;
18 for(int j=0;j<js&&i*ss[j]<m;j++)
19 {
20 sz[i*ss[j]]=0;
21 if(i%ss[j]==0)break;
22 }
23 }
24 }
25 void fj(int i)//n的阶乘中含有多少个ss[i],时间复杂度可能是logxn(感觉是)
26 {
27 int x=ss[i];
28 int k=n;
29 while(k)
30 {
31 k=k/x;
32 cs[i]+=k;
33 }
34 }
35 long long por(long long x,long long y)//快速幂
36 {
37 if(y%2)y=y-1;
38 x=x%md;
39 long long anss=1;
40 long long ds=x;
41 for(;y>0;y>>=1)
42 {
43 if(y&1)anss*=ds;
44 anss%=md;
45 ds=(ds%md)*(ds%md)%md;
46 }
47 return anss;
48 }
49 int main()
50 {
51 freopen("hao.in","r",stdin);
52 freopen("hao.out","w",stdout);
53 scanf("%d",&n);
54 sss();
55 for(int i=0;i<js;i++)
56 fj(i);
57 for(int i=0;i<js;i++)
58 {
59 ans*=por(ss[i],cs[i]);
60 ans%=md;
61 }
62 cout<<ans;
63 fclose(stdout);
64 fclose(stdin);
65 return 0;
66 }
济南学习D3T1__线性筛和阶乘质因数分解的更多相关文章
- 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors
d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...
- [学习笔记] Miller-Rabin质数测试 & Pollard-Rho质因数分解
目录 Miller-Rabin质数测试 & Pollard-Rho质因数分解 Miller-Rabin质数测试 一些依赖的定理 实现以及正确率 Pollard-Rho质因数分解 生日悖论与生日 ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- 对于n!的快速质因数分解
N!的阶乘的质因数分解 对于N的阶乘 比如8! 我们要算其中一个质因数出现次数 我们注意到 8!=1 2 3 4 5 6 7 8 1 1 1 1 2的倍数出现的次数8/2=4 1 1 4的倍数出现的次 ...
- Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记
最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...
- jzp线性筛及其简单应用
前言: 很久以前看过了线性筛,没怎么注意原理,但是后来发现线性筛还有很有用的.. 比如上次做的一道题就需要找出每个数的最小质因子,先筛再找就太慢了..一看线性筛发现就可以直接在筛的过程中处理出来了! ...
- BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元
2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...
随机推荐
- Atlas 2.1.0 实践(2)—— 安装Atlas
在完成Atlas编译以后,就可以进行Atlas的安装了.Atlas的安装主要是安装Atlas的Server端,也就Atlas的管理页面,并确保Atlas与Kafka Hbase Solr等组件的集成. ...
- [LeetCode]501. Find Mode in Binary Search Tree二叉搜索树寻找众数
这次是二叉搜索树的遍历 感觉只要和二叉搜索树的题目,都要用到一个重要性质: 中序遍历二叉搜索树的结果是一个递增序列: 而且要注意,在递归遍历树的时候,有些参数如果是要随递归不断更新(也就是如果递归返回 ...
- Light Probes
LightProbes (光照探针,光探测器?) 提供了一种方法用于捕获和使用 穿过场景中空白空间的 光(light)的信息. 和光照贴图相似(lightmaps),Light Probes也存储关于 ...
- Scanner详解
java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入 1)public static void main(String[] args) { S ...
- jQuery EasyUI学习一
1. jQuery EasyUI介绍 1. 创建组件的方式和原理(掌握) 2. 组件三要素(掌握) 3. Panel.LinkButton.上下文菜单;(掌握) 简介 2.1. jQuer ...
- SalesForce学习——权限管理
Salesforce 对于权限的管理是非常严谨的并且支持不同维度的权限控制.常用的有简档.权限集.角色层级机构.组织范围. 简档:Profiles是Salesforce为每个用户指定的标准配置文件,在 ...
- java线程,进程,多线程
(1)线程和进程 通俗一点,进程就是一个应用程序在处理机上的一次执行过程,它是一个动态的概念,而线程是进程中的一部分,进程包含多个线程在运行. (2)java中实现线程的两种方式,第一种是继承Thre ...
- Flask 操作Mysql数据库 - flask-sqlalchemy扩展
数据库的设置 Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的.它使用结构化的查询语言.关系型数据库的列定义了表中 ...
- vue element 表单验证不通过,滚动到固对应位置
我们在使用elementIUI实现表单验证,内容比较多的时候,提示内容会被遮挡,这时候用户不清楚什么情况,还会连续点击提交按钮.这个时候需求来啦:我们需要在表单验证不通过的时候,页面滚动到对应的位置. ...
- C++ 入门篇
C++基础入门 1 C++初识 1.1 第一个C++程序 编写一个C++程序总共分为4个步骤 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 Visual Studio是我们用来编写 ...