题意:给定一个n,然后让你从1-n中选出某些数乘起来,使得乘积最大,并且乘积必须是完全平方数。

思路:将1-n种每个数都分解素因子,把他们的素因子的幂加起来,如果是偶数,就说明可以构成完全平方数,乘起来,如果是奇数,说明不能构成,减去一个就是偶数了,所以减去一个再乘起来。因为要分解1-n当中所有的素因子,然后乘起来,那么也就是分解n!的素因子,所以只要找出来他的所有的素因子的幂指数为奇数的直接除就行了。现在有个问题是不能除。要取模,更好的方法是,再算n!的时候,不乘素数,那样的话,就到最后再乘。如果是奇次幂,就不用乘,偶次幂再乘。这样的话,就需要找出1-n当中素因子是多少次幂,方法是,直接用n除以素因子,然后加起来,知道n为0。具体见代码。

吐嘈:这个题意完全读不懂啊。。。看了题解才知道的。还有就是这种方法太奇妙了。赞赞赞!

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll;
const int maxn = ;
const ll mod = 1000000007LL;
const int sqrtmaxn = (int)(sqrt((double)maxn));
ll fac[maxn];
int prime[maxn];
int cnt;
void init()
{
memset(prime, , sizeof(prime));
fac[] = fac[] = ;//阶乘
cnt = ;
for (int i = ; i < maxn; i++)
{
fac[i] = fac[i - ];
if (prime[i] == )//如果是素数,就先不乘
{
prime[cnt++] = i;
if (i <= sqrtmaxn)
for (int j = i * i; j < maxn; j += i)
prime[j] = ;
}
else fac[i] = (fac[i] * i) % mod;//不是素数直接乘
}
}
int main()
{
init();
int n;
while (~scanf("%d", &n) && n)
{
ll ans = fac[n];
for (int i = ; i < cnt && prime[i] <= n; i++)
{
int tot = , tmp = n;//tmp统计素因子的幂次
while (tmp) tot += (tmp /= prime[i]);
if ((tot & ) == ) ans = (ans * prime[i]) % mod;
}
printf("%d\n", (int)ans);
}
return ;
}

HDU 4196 Remoteland的更多相关文章

  1. Remoteland HDU - 4196

    题意: 给出一个n,在[1, n] 中挑选几个不同的数相乘,求能的到的最大完全平方数 解析: 最大的肯定是n!, 然后n!不一定是完全平方数 (我们知道一个完全平方数,质因子分解后,所有质因子的质数均 ...

  2. HDU 4196

    很容易由算术基本定理知道,完全平方数就是所有质因子指数为偶数的数.而求得N以下的质因子,可由前两篇的公式知,由N!与p的关系求得.对于指数为p的,用N!除去就可以,因为p必定属于N以内,且无重复. 至 ...

  3. BZOJ 4196: [Noi2015]软件包管理器 [树链剖分 DFS序]

    4196: [Noi2015]软件包管理器 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1352  Solved: 780[Submit][Stat ...

  4. HDOJ 2111. Saving HDU 贪心 结构体排序

    Saving HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. 【HDU 3037】Saving Beans Lucas定理模板

    http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...

  6. hdu 4859 海岸线 Bestcoder Round 1

    http://acm.hdu.edu.cn/showproblem.php?pid=4859 题目大意: 在一个矩形周围都是海,这个矩形中有陆地,深海和浅海.浅海是可以填成陆地的. 求最多有多少条方格 ...

  7. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  8. HDU 4006The kth great number(K大数 +小顶堆)

    The kth great number Time Limit:1000MS     Memory Limit:65768KB     64bit IO Format:%I64d & %I64 ...

  9. HDU 1796How many integers can you find(容斥原理)

    How many integers can you find Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d ...

随机推荐

  1. SPRING IN ACTION 第4版笔记-第一章-002-DI介绍

    一. 1.knight.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&qu ...

  2. Delphi xe10下载(包含破解补丁和破解视频)

    软件名称:RAD Studio 10 Seattle软件大小:7.18 GB RAD Studio 10 Seattle官方下载地址:http://altd.embarcadero.com/downl ...

  3. 你们都是怎么阅读android系统源码的,用什么工具?

    如果是eclipse,可以建立java或者c++工程,把framework源码导入.packages目录下的可以建立android工程.sourceinsight的话,建立工程把相应模块的代码添加进去 ...

  4. C# web 网页刷新时数据集的保存和应用

    Web 数据访问策略建议 设计 Web 应用程序中的数据访问时,您要做出多种选择,例如与数据源通信的方式.是否在页的往返过程之间存储数据.以及如果确实要存储数据应存储在何处等.您所做的选择可以确定应用 ...

  5. 【转】Android4.4(MT8685)源码蓝牙解析--BLE搜索

    原文网址:http://blog.csdn.net/u013467735/article/details/41962075 BLE:全称为Bluetooth Low Energy.蓝牙规范4.0最重要 ...

  6. ARM学习笔记5——程序状态寄存器

    当前程序状态寄存器CPSR可以在任何位处理器模式下被访问,它包含条件码标志.中断控制.当前处理器模式以及其他状态和控制信息.CPSR的结构图如下: 一.条件标志位 CPSR最高4位:N(Negativ ...

  7. oracle查看表锁及解锁

    --kill session语句 1 alter system kill SESSION '2171,60490'; --以下几个为相关表 1 2 3 4 5 6 7 SELECT * FROM v$ ...

  8. win7IIS错误修改路径最全的

    http://blog.csdn.net/testcs_dn/article/details/8726480 http://www.myexception.cn/asp-dotnet/1341569. ...

  9. 找回linux丢失的磁盘空间

    最近一台服务器空间总是报警,磁盘空间不足. 使用 df 命令查看,磁盘空间耗用接近 100%,将机器上过期的数据以及日志清理掉,但是空间很快又是接近 100%. 使用 du 查看,想找出磁盘空间被耗用 ...

  10. 一步一步学android控件(之二十五)—— SeekBar

    SeekBar扩展自ProgressBar——在ProgressBar的基础上添加了一个用户可以拖拽的thum. SeekBar.OnSeekBarChangeListener是接收SeekBar进度 ...