这道题是我做CodeTon Round1时的D题,总的来看思路很重要,有几个比较明显的切入问题的角度,要选择到最优的那个;

先看题目:

我们可以发现,这道题的描述一目了然,就是说我们能不能找k个数的和正好等于我们输入的n;

但是有对于这k个数的限制:

·k>=2

`k[i]%k 不相同

所以我们粗略的想想就可以想到,既然这k个数的关于k的余数都不相同,且为k个正数,所以我们就可以这么想这k个数是在1,2,3……,k的基础上进行的修改(+k || +2k || +3k……),所以我们就可以得到这样一个一定正确的式子:

我们先令dp[i]为i的高斯求和,k是我们最后的ans:

if ( (n - dp[k]) % k == 0 ) ans = k;

解释一下:因为n能和这个高斯和的差能被k整除得到x,说明我只要对于1~k中的任意x个数加上一个k或者对一个数加上xk都能得到这k个数;

单看这个分析是正确的,但是这道题不能这样去做是因为n的数据范围太大了!!!如果我要得到这么dp[k]去match 10^18这个数量级的话,根据高斯求和,我起码要开10^9这么大的数组,而且还得从前往后遍历,这很明显是不正确的;

所以我们对于一个数据很大的问题我们肯定是能找到某种规律是他们普遍适用的,或者说我们能逐渐将数据缩小到一个我们可以接受的范围,而且这个缩小数据的过程也一定不能是一个一个往下缩,一般采取log级别的缩减;这是解决这种问题的总体思路;

所以我会自然而然地想到我们分成奇数和偶数,然后就可以发现,当n为奇数时,一定可以取k = 2,因为3k + 2是k取2时所能涵盖的所有数,即除了1之外的奇数;那么奇数问题解决了,我们就会去想解决偶数问题 , 但是我很难对这些偶数进行分类,只能根据样例1猜测是不是所有的2的指数幂的数都只能输出-1;

虽然上面的两个思路都没有完整的求解出我们所要的答案,但是他对于找出正确答案是有借鉴作用的,我们先去看到之前我们得出的那个充分必要条件,并将其中的dp用高斯求和展开可得 ( n - (1+k)*k/2 ) 是k的整数倍即可,然后我们可以根据数学轻松得出n和(1+k)*k/2 是k的整数倍就行了呗,由后面那个式子可以得出k只有为奇数时,后面那个才能是k的整数倍;

然后我们再将目光聚焦到前面的n上,当n为奇数时不用想肯定是可以取2的(前面的借鉴作用),所以当n为偶数时,如果他能被k整除,就是对的,说明n不能是2的指数幂,再次证明了我们刚刚的猜想是正确的;所以我们做以下操作:

当n能被2整除时,就除以2直到n变成奇数,也就是我们这里要的k就行了;

但是问题真正解决了吗? 如果当前的dp[k] > n本身呢?说明我们k取大了对吧,然后我们刚刚的操作相当于把n拆成了奇数k和2的指数幂x,那我们就想取x,又会发现后半部分除以x后变成(1+x)/ 2,因为x为偶数,所以这样是不行的,所以我们就想这个2这么碍眼,如果我干脆取2x,会得到(k - 1 - 2x ) / 2,我们要证明这个能整除且为非负数,因为k为奇数,1+2x为奇数,所以奇数减奇数肯定是偶数,所以一定成立,但是k一定要大于等于2x+1,就一定满足题干,所以我们发现2x  < k时,dp[k] > n ,2x >k时,dp[k]一定刚好满足条件;

所以对于k>1时,我们就取最后的ans = min(k,2x);

总结:这道题很多主要是数学思想上的,很多地方需要用到猜想的方法,然后对于应付大数据的数我们就要这样类似的处理,然后我们可能一开始得不出正确答案,但是通过调整之后一定能够得出我们所要的ans;

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

int main()
{
int t;
cin >> t;
while(t--){
LL n;
cin >> n;
LL k = 1;
while(n%2 == 0){
n/=2;
k*=2;
}
if(n == 1) cout << -1 <<'\n';
else cout << min(n,2*k) << '\n';
}
return 0;
}

K-good number Theory + 数学问题的更多相关文章

  1. 2016级算法第二次上机-F.ModricWang's Number Theory II

    891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...

  2. Number Theory Problem(The 2016 ACM-ICPC Asia China-Final Contest 找规律)

    题目: Mr. Panda is one of the top specialists on number theory all over the world. Now Mr. Panda is in ...

  3. 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树

    [BZOJ4026]dC Loves Number Theory Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.    给 ...

  4. BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数

    BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...

  5. [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环

    E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...

  6. 题解-Ehab's REAL Number Theory Problem

    Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...

  7. 计蒜客 31452 - Supreme Number - [简单数学][2018ICPC沈阳网络预赛K题]

    题目链接:https://nanti.jisuanke.com/t/31452 A prime number (or a prime) is a natural number greater than ...

  8. BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学

    Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...

  9. HDU 1018-Big Number(数学)

    Big Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

随机推荐

  1. suse 12 二进制部署 Kubernetets 1.19.7 - 第13章 - 部署metrics-server插件

    文章目录 1.13.0.创建metrics-server证书和私钥 1.13.1.生成metrics-server证书和私钥 1.13.2.开启kube-apiserver聚合配置 1.13.3.分发 ...

  2. 利用 docker 部署 elasticsearch 集群(单节点多实例)

    文章目录 1.环境介绍 2.拉取 `elasticserach` 镜像 3.创建 `elasticsearch` 数据目录 4.创建 `elasticsearch` 配置文件 5.配置JVM线程数量限 ...

  3. Linux CentOS 搭建SVN并用钩子自动实现同步到Web目录

    linux安装配置SVN并设置钩子   安装说明 系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 检查已安装版本 # ...

  4. Zookeeper 提供的API

    上篇介绍了Zookeeper命令行相关的知识,本小作文介绍从另一个维度操作Node相关的内容:Zookeer的API.同样借用Zookeeper应用之一的数据注册与订阅中的案例类比命令行操作,重点介绍 ...

  5. Linux下使用Shell处理文本时最常用的工具

    find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 正则方式查找. ...

  6. 用NSoup解析HTML

    1.在NuGet程序包中添加NSoup包 public static void TestNSoup(string urlStr) { WebClient wc = new WebClient(); b ...

  7. LeetCode-079-单词搜索

    单词搜索 题目描述:给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过 ...

  8. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  9. 前端工程化:使用 shelljs 生成 yapi 接口文件

    之前的文章介绍了使用 yapi-to-typescript (下文简称 ytt)生成接口类型定义文件,方便我们直接使用接口的请求和响应类型,能减少很多写接口类型的时间. 使用 yapi-to-type ...

  10. Linux swap分区操作

    swap交换分区是系统RAM的补充,swap 分区支持虚拟内存.当没有足够的 RAM 保存系统处理的数据时,会将数据写入 swap 分区,当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止 ...