HDU - 5976 Detachment(逆元)
题意:将一个数x拆成a1+a2+a3+……,ai不等于aj,求最大的a1*a2*a3*……。
分析:
1、预处理前缀和前缀积,因为拆成1对乘积没有贡献,所以从2开始拆起。
2、找到一个id,使得2+3+4+……+id - 1(sum[id-1]) < x < 2+3+4+……+id(sum[id)。(二分找即可)
则rest = x - sum[id - 1]。将rest分配给2+3+4+id-1中的某个数。
3、在保证数字不重复的前提下,分配给的那个数越小越好,证明见4。
因此,应该分配给的数为id-rest。但是在id-rest小于2时,那还应该分配给2,2是可以分配的数字中最小的数字。
假设分配给4,那么最后的结果中,mul[id-1]应除以4(把4去掉),然后再乘上(4+rest)。
4、证明:设tmp=2*3*4*……*(id - 1)。
假设既可分配给4,也可分配给5的情况下,
将rest分配给4:设tmp=4*t1,则ans1=(4+rest)*t1,
将rest分配给5:设tmp=5*t2,则ans2=(5+rest)*t2,
因为t1>t2,所以ans1>ans2,得证。
5、PS:2为偶数,3为奇数,2x+3y可以表示大于1的所有正整数,3最多的时候最优。
6、逆元
1、除法取模要用逆元。
遇到(a/b)%mod这种情况,应转化成(a*k)%mod,k即为a在mod下的逆元。
2、递推求逆元
inv[1]=1
for(i=2;i<n;i++)
inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD
3、定义:
若a*b=1(mod MOD)则称作b是a在模MOD下的逆元。记作a^-1=b(mod m)
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 100000 + 10;
typedef long long LL;
LL sum[MAXN], mul[MAXN], inv[MAXN];
const LL MOD = 1e9 + 7;
void init(){
sum[1] = 0, mul[1] = 1, inv[1] = 1;
for(int i = 2; i < MAXN; ++i){
sum[i] = sum[i - 1] + i;
mul[i] = ((mul[i - 1] % MOD) * (i % MOD)) % MOD;
inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
}
}
int main(){
int T;
scanf("%d", &T);
init();
while(T--){
LL x;
scanf("%lld", &x);
if(x == 1){
printf("1\n");
continue;
}
int id = lower_bound(sum + 2, sum + MAXN, x) - sum;
if(sum[id] == x){
printf("%lld\n", mul[id]);
continue;
}
--id;
LL rest = x - sum[id];
LL ans;
if(2 + rest > id){
ans = ((mul[id] * inv[2]) % MOD * (2 + rest)) % MOD;
}
else{
ans = ((mul[id] * inv[id + 1 - rest]) % MOD * (id + 1)) % MOD;
}
printf("%lld\n", ans % MOD);
}
return 0;
}
HDU - 5976 Detachment(逆元)的更多相关文章
- HDU 5976 Detachment(拆分)
HDU 5976 Detachment(拆分) 00 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem D ...
- HDU 5976 Detachment 打表找规律
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5976 Detachment Time Limit: 4000/2000 MS (Java/Other ...
- HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 5976 Detachment
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- hdu 5976 Detachment 脑洞题 猜结论
题目链接 题意 将\(x\)拆成\(a_1+a_2+...+\)的形式,且\(a_1\lt a_2\lt...\),使得\(a_1*a_2*...\)取到最大值 思路 大胆猜结论. 首先拆分的形式中肯 ...
- HDU 5976 数学,逆元
1.HDU 5976 Detachment 2.题意:给一个正整数x,把x拆分成多个正整数的和,这些数不能有重复,要使这些数的积尽可能的大,输出积. 3.总结:首先我们要把数拆得尽可能小,这样积才会更 ...
- HDU 1576 (乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...
- HDU 5976 数学
Detachment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 5651 组合+逆元
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5651 题目意思我看了半天没读懂,一直以为是回文子串又没看见substring的单词最后看博客才知道是用给 ...
随机推荐
- 不一样的Vue实战3:布局与组件
不一样的Vue实战3:布局与组件 发表于 2017-06-05 | 分类于 web前端| | 阅读次数 11534 http://yangyi1024.com/2017/06/05/%E4%B ...
- vmware workstation导入ovf文件报错:未通过OVF规范一致性或虚拟硬件合规性检查
转自:https://blog.csdn.net/zs15yy/article/details/73793585 报错如下: 原因:这是因为OVF 版本不同导致的,VMware Workstation ...
- 还是应该立个flag
6月份 开通博客的想法很简单,就是决定要学习C++和算法,写博客作为督促自己的一个方式,因为还没有系统的学习,自认为写博客或见解有些力所不及,决定先从自己的一篇随笔开始,因为我知道自己一旦开始,就会坚 ...
- 「NOIP2016」天天爱跑步
传送门 Luogu 解题思路 树上差分+桶计数. 我们发现在一条路径上的点 \(i\) ,它可以观测到玩家的条件是: \(i \in (u \to LCA),dep_u=w_i+dep_i\) \(i ...
- DevOps - 自动化工具
章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...
- java 移动距离
移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 ...
- phpMydmin的GetShell思路
phpMyadmin简介 phpMyadmin是一个以PHP为基础的MySQL数据库管理工具,使网站管理员可通过Web接口管理数据库 . 信息收集 此部分主要需要收集的是网站物理路径,否则后续无法通过 ...
- other#一些问题的列表
centos7及以后修改hostname, hostnamectl set-hostname centos7 centos7之前修改hostname, vi /etc/sysconfig/networ ...
- Java连载68-数组的拷贝、二维数组
一.数组的拷贝 函数arraycopy(),参数为:源数组.源数组的开始下标.目标数组.目标数组的开始下标.拷贝长度 package com.bjpowernode.java_learning; ...
- Python中eval与exec用法的区别
Python中eval,exec这两个函数有着相似的输入参数类型和执行功能,因此在用法上经常出现混淆,以至经常用错,程序易抛出错误.下面主要通过这两个函数的语法来阐述区别,并用例子来进一步说明. 首先 ...