vijos 小三学算术
描述
小三的三分球总是很准的,但对于数学问题就完全没有想法了,他希望你来帮他解决下面的这个问题:对于给定的n,从1!、2!、3!、……、n!中至少删去几个数,才可以使剩下的数的乘积为完全平方数?
格式
输入格式
仅一行,包含一个整数n(1≤n≤500)。
输出格式
第一行包含一个整数k,表示最少需要删去的数字个数。
接下来一行,从小到大排列的k个[1,n]之间的整数,给出删数的方案。如果方案不止一种,输出方案从小到大排序序列最小的一组即可。
样例1
样例输入1
5
样例输出1
2
2 5
限制
各个测试点1s
提示
样例说明:去掉2!和5!,剩下的是4!、3!和1!,它们的乘积为4!×3!×1!=24×6=144。
分析:数学一本通上一本非常神的题.先对每个数分解质因数,如果一个数是完全数,那么它的所有质因子的次数一定要是偶数,这样的话很难操作,没有什么特别好的方法.尝试搜索,因为不知道要删掉几个数,可以用迭代深搜,可能会惊奇地发现自己过了,因为这道题有一个结论:答案不超过3.
先把阶乘两两分组,(1*2!)*(3!*4!)*(5!*6!)......每一组前面的数会被后面的数所覆盖,这些数的质因子的次数一定是偶数,那么把每一组对答案有影响的数给提出来:2*4*6*......再提一个2出来:
2*(1*2*3*......)=2!*(n/2)!那么删掉这两个阶乘就好了.这是n为偶数的情况,如果n为奇数,那么就把最后单独的那一个给删掉,然后就变成了偶数的情况,所以最多删3个数.
奇偶性的转换可以利用异或运算来实现.不过代码有缺陷,质因子个数可能会大于300.自己改不动了......
#include <cstdio>
#include <cmath>
#include <map>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; ll n, maxn, use[], prime[], vis[], tot, sta[], tsta, staa[];
ll num[], ans[];
bool flag = false;
//位运算 void dfs(ll dep, ll maxx, ll nowsta, ll num)
{
if (dep == n + || num == maxx + )
{
if (nowsta == )
{
for (ll i = ; i <= maxx; i++)
ans[i] = use[i];
flag = ;
}
return;
}
ll temp = nowsta ^ sta[dep];
dfs(dep + , maxx, nowsta, num);
use[num] = dep;
dfs(dep + , maxx, temp, num + );
} void init()
{
for (ll i = ; i <= ; i++)
{
if (!vis[i])
prime[++tot] = i;
for (ll j = ; j <= tot; j++)
{
ll t = prime[j] * i;
if (t > )
break;
vis[t] = ;
if (i % prime[j] == )
break;
}
}
} int main()
{
init();
scanf("%lld", &n);
for (ll i = ; i <= n; i++)
{
ll x = i;
for (ll j = ; j <= ; j++)
{
ll p = ;
while (x && x % prime[j] == )
{
x /= prime[j];
p = (p + ) % ;
}
if (p == )
staa[i] |= (1LL << (j - ));
}
}
memcpy(sta, staa, sizeof(staa));
for (ll i = ; i <= n; i++)
for (ll j = ; j < i; j++)
sta[i] ^= staa[j];
for (ll i = ; i <= n; i++)
{
if (i == )
tsta = sta[i];
else
tsta ^= sta[i];
}
while ()
{
maxn++;
memset(use, , sizeof(use));
dfs(, maxn, tsta, );
if (flag)
{
printf("%lld\n", maxn);
for (int i = ; i <= maxn; i++)
printf("%lld ", ans[i]);
break;
}
} return ;
}
vijos 小三学算术的更多相关文章
- PowerShell小技巧 算术表达式求值
前几天要统计一个组虚拟机使用的硬盘容量,只希望得到一个大概的值,计算的值截图如下: 写成算术表达式的话大概是:60 * 3 + 80 * 2 + 90 * 3 + 120 * 6 + 140 * 2 ...
- U1总结
import java.io.Writer; import java.util.Iterator; import javax.xml.transform.TransformerFactory; imp ...
- SQL Server 数据库索引
原文:SQL Server 数据库索引 一.什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用[索引] 索引允许SQL Server在表中查找数据而不需要扫描整个表. 1.1.索引的好处: ...
- K:逆波兰算法
相关介绍: 一种求解字符串形式的表达式的结果的算法,该算法在求解时,需要先将我们平日里习惯上使用的中序表达式的模式转化为等价的后序(后缀)表达式的模式,之后再通过求解出该后序(后缀)表达式的结果而得 ...
- SQL语句中的select高级用法
#转载请联系 为了更好的了解下面的知识点,我们先创建两张表并插入数据. # 学生表 +----+-----------+------+--------+--------+--------+------ ...
- 六 BASH 高级变量
高级变量分为三类 变量扩展 ${变量名} 例 ${filename} 大括号 命令替换 $(命令) $(ls /) 小括号 算术扩展 $((算数式)) $(( ...
- 【2016常州一中夏令营Day6】
小 W 算树[问题描述]山有苞棣,隰有树檖.未见君子,忧心如醉~小 W 养了一棵有 N 个点的无根树,由于小 M 最喜欢二叉树了,为了讨小 M 欢喜,小 W想知道有多少个点作为根后,这棵树是一棵二叉树 ...
- C语言运算符优先级和结合性一览表
所谓优先级就是当一个表达式中有多个运算符时,先计算谁,后计算谁.这个其实我们在小学学算术的时候就学过,如1+4÷2. 但是C语言中的运算符已经远不止四则运算中的加减乘除了,还有其他很多运算符.当它们出 ...
- 【vijos】1746 小D的旅行(dijkstra)
https://vijos.org/p/1746 这题就是水题.裸的跑完每个点的最短路后直接可以暴力出解.. 这题贴出来是因为我改了下我的dijkstra的模板...(其实是原来一直写错了233 注意 ...
随机推荐
- 账号被锁无法ssh登陆
Account locked due to failed logins 方法一: 使用root用户登陆后执行: pam_tally2 --user=username --reset 方法二: user ...
- 使用经验风险最小化ERM方法来估计模型误差 开坑
虽然已经学习了许多机器学习的方法,可只有我们必须知道何时何处使用哪种方法,才能将他们正确运用起来. 那不妨使用经验最小化ERM方法来估计 . 首先: 其中, δ代表训练出错的概率 k代表假设类的个数 ...
- Wampserver 修改根目录
wampserver 默认根目录在 www 文件夹下 修改根目录方法如下: 1. 在打算存放项目或代码的位置新建文件夹(我建在了C:/MyProject) 2. 打开 httpd.conf 文件(该文 ...
- python基础-02-while格式化逻辑运算
python其他知识目录 1.循环打印“我是小马过河” while True: print('我是小马过河') #4.用while从一打印到10 #5.请通过循环,1 2 3 4 5 6 8 9 ...
- 20181016-4 Alpha阶段第1周/共2周 Scrum立会报告+燃尽图 04
此作业要求https://edu.cnblogs.com/campus/nenu/2018fall/homework/2248 Scrum master:徐常实 一.小组介绍 组长:王一可 组员:范靖 ...
- 针对某一网站的UI进行分析
本周课上教学通过对PM(项目经理)的学习,我了解到PM 对项目所有功能的把握, 特别是有关的UI内容.最差的UI, 体现了团队的组织架构:其次, 体现了产品的内部结构:最好, 体现了用户的自然需求. ...
- 依据Right-BICEP要求的对四则运算2的测试
代码: #include <iostream> #include <time.h> #include <stdio.h> #include <stdlib.h ...
- HDU 5617 Jam's maze dp+滚动数组
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5617 bc(中文):http://bestcoder.hdu.edu.cn/contest ...
- Spring学习(七)——增强类
Spring 切点 什么是切点?切点(Pointcut),每个程序类都拥有多个连接点,如一个拥有两个方法的类,这两个方法都是连接点,即连接点是程序类中客观存在的事物.但在这为数从多的连接点中,如何定位 ...
- css3 伪元素 ::before ::after
键代码分析: /*css代码*/ .effect::before, .effect::after{ content:""; position:absolute; z-index:- ...