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的单词最后看博客才知道是用给 ...
随机推荐
- JS 自动返回每个月的天数
);//M代表月份,可以自己手动设置或者选择 date.setDate() var num = date.getDate(); console.log(num) //输出每个月的天数 var time ...
- STM32CubeIDE printf 串口重定向
- java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2
我们继续学习类与对象,上一篇我们定义了 坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...
- 2017北京网络赛 F Secret Poems 蛇形回路输出
#1632 : Secret Poems 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 The Yongzheng Emperor (13 December 1678 – ...
- POJ 3669 Meteor Shower BFS求最小时间
Meteor Shower Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 31358 Accepted: 8064 De ...
- VUE - vuex state的使用
1,安装 进入项目目录,执行 vue add vuex 命令 2,会在src的目录下新增store文件夹 3,打开store文件夹下的index.js , 给 state 设定一些数据 impor ...
- ubuntu16下安装mongodb 3.6
1.安装MongoDB社区版 # 1. 导入MongoDB public GPG Key sudo apt-key adv --keyserver hkp://keyserver.ubuntu ...
- tomcat多实例配置
有一台server上跑个tomcat的实例的情况,我遇到过这种情况,毕竟把多个应用部署到一个实例中,如果某个应用出了问题,导致tomcat奔溃,其他应用也gg了.闲话到此. 通常部署多实例就是解压多个 ...
- JSONPath 表达式的使用
一.JSONPath使用需要的包 <dependency> <groupId>com.jayway.jsonpath</groupId> <artifactI ...
- 新闻类网站的通用爬虫--GNE
GNE(GeneralNewsExtractor)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容.标题.作者.发布时间.正文中的图片地址和正文所在的标签源代码.GNE在提 ...