K-good number Theory + 数学问题
这道题是我做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 + 数学问题的更多相关文章
- 2016级算法第二次上机-F.ModricWang's Number Theory II
891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...
- 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 ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数
BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...
- [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& ...
- 题解-Ehab's REAL Number Theory Problem
Ehab's REAL Number Theory Problem 前置知识 质数 分解质因数 无向无权图最小环<讲> Ehab's REAL Number Theory Problem/ ...
- 计蒜客 31452 - Supreme Number - [简单数学][2018ICPC沈阳网络预赛K题]
题目链接:https://nanti.jisuanke.com/t/31452 A prime number (or a prime) is a natural number greater than ...
- BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学
Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...
- HDU 1018-Big Number(数学)
Big Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
随机推荐
- Solution -「洛谷 P5236」「模板」静态仙人掌
\(\mathcal{Description}\) Link. 给定一个 \(n\) 个点 \(m\) 条边的仙人掌,\(q\) 组询问两点最短路. \(n,q\le10^4\),\(m\ ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- Solution -「LOCAL」Drainage System
\(\mathcal{Description}\) 合并果子,初始果子的权值在 \(1\sim n\) 之间,权值为 \(i\) 的有 \(a_i\) 个.每次可以挑 \(x\in[L,R]\) ...
- 痞子衡嵌入式:对比MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MbedTLS算法库纯软件实现与i.MXRT上DCP,CAAM硬件加速器实现性能差异. 近期有 i.MXRT 客户在集成 OTA SBL ...
- 【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容
问题描述 APIM中的内容(API, Policy)等内容,如果有需要更新时候,通常可以在Azure APIM门户上操作,通过一个接口一个设置的修改,也可以针对一个接口导入/导出的方式修改.当APIM ...
- .Net Core AOP之IResultFilter
一.简介 在.net core 中Filter分为以下六大类: 1.AuthorizeAttribute(权限验证) 2.IResourceFilter(资源缓存) 3.IActionFilter(执 ...
- NSSCTF-[鹤城杯 2021]A_MISC
下载压缩包,解压需要输入密码,使用winhex打开发现不是zip的伪加密,然后使用爆破工具进行爆破得到密码 解压压缩包获得一个png打开是一个URL,常用的都知道,百度网盘的文件分享的链接,复制打开U ...
- Maven-compiler-plugin 插件编译过程中报缺失get/set方法
一般都是由于使用了lombok插件导致的 解决方法: 首先将compiler插件版本升级到3.3以上, 查询资料发现说有可能是版本太低导致 在configuration中添加上annotationPr ...
- 开发Windows程序的三种方式
软件开发方式一共有三种:SDK方式.MFC开发方式.托管环境的开发都是基于消息的开发 SDK方式 原装api的调用SDK方式使用C语言和Windows应用程序编程接口(Windows API)来开发W ...
- HTML分块
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>菜鸟 ...