【问题描述】

从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__线性筛和阶乘质因数分解的更多相关文章

  1. 【线性筛】【质因数分解】【约数个数定理】hdu6069 Counting Divisors

    d(x)表示x的约数个数,让你求(l,r<=10^12,r-l<=10^6,k<=10^7) #include<cstdio> using namespace std; ...

  2. [学习笔记] Miller-Rabin质数测试 & Pollard-Rho质因数分解

    目录 Miller-Rabin质数测试 & Pollard-Rho质因数分解 Miller-Rabin质数测试 一些依赖的定理 实现以及正确率 Pollard-Rho质因数分解 生日悖论与生日 ...

  3. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  4. 对于n!的快速质因数分解

    N!的阶乘的质因数分解 对于N的阶乘 比如8! 我们要算其中一个质因数出现次数 我们注意到 8!=1 2 3 4 5 6 7 8 1 1 1 1 2的倍数出现的次数8/2=4 1 1 4的倍数出现的次 ...

  5. Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论

    题目链接:http://codeforces.com/problemset/problem/893/E 题意: 共q组数据(q <= 10^5),每组数据给定x,y(x,y <= 10^6 ...

  6. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  7. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

  8. jzp线性筛及其简单应用

    前言: 很久以前看过了线性筛,没怎么注意原理,但是后来发现线性筛还有很有用的.. 比如上次做的一道题就需要找出每个数的最小质因子,先筛再找就太慢了..一看线性筛发现就可以直接在筛的过程中处理出来了! ...

  9. BZOJ-2186 沙拉公主的困惑 线性筛(筛筛筛)+线性推逆元

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 2417 Solved: 803 [Submit][St ...

随机推荐

  1. Vue知识点精简汇总

    一. 组件component 1. 什么是组件? 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码组件是自定义元素(对象) 2. 定义组件的 ...

  2. 元旦在家撸了两天Seata源码,你们是咋度过的呢?

    撸Seata源码 2020年12月31日晚23点30分,我发了2020年的最后一个朋友圈:假期吃透Seata源码,有组队的吗? 不少小伙伴都来点赞了, 其中也包括Seata项目的发起人--季敏大佬哦! ...

  3. windows server 2012 R2里IIS配置.net core2.1遇到的坑

    首先刚接触.net core不久,在本地也是简单写点测试程序,没遇到过什么问题,感觉还行,最近朋友搞了个asp.net core2.1的程序,让我给他服务器配置一下,我想这都跨平台了有什么难的吗?拿来 ...

  4. 关于 RNN 循环神经网络的反向传播求导

    关于 RNN 循环神经网络的反向传播求导 本文是对 RNN 循环神经网络中的每一个神经元进行反向传播求导的数学推导过程,下面还使用 PyTorch 对导数公式进行编程求证. RNN 神经网络架构 一个 ...

  5. vue中选中弹出框内的表格

    一:可多选情况且对应勾选 由于是弹出框形式,所以会出现新增DOM与数据的改变问题,因此要使用$nextTick,不然一开始弹出得时候DOM还没有生成,却要获取DOM会报错:这种多选情况会出现一个bug ...

  6. Writing in the science: Introducion

    1.what makes a good writing? 2.what makes a good writer? 1) have something to say 2) logical thinkin ...

  7. Log4j配置按照文件大小和日期分割日志文件

    目录 Log4j 下载地址 文件大小分割日志文件 以日期分割每天产生一个日志文件 自定义信息输出到日志文件 Log4j 下载地址 Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控 ...

  8. 【Oracle】修改列的大小

    alter table 表名 modify column_name varchar2(32)  alter table 表名 modify (column_name1 varchar(20) defa ...

  9. kubernets之服务资源

    一  服务集群内部或者客户端与pod的通信桥梁   kubernets集群的内部pod访问为啥不能使用传统的IP:PORT的形式? pod是短暂的,它们会随时启动或者关闭,原因可能是pod所在的节点下 ...

  10. CTFHub - Web(三)

    密码口令: 弱口令: 1.随意输入账号密码,抓包, 2.右击,"Send to Intruder",打开选项卡Intruder,点击position,椭圆框处软件已经自动为我们把要 ...