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的单词最后看博客才知道是用给 ...
随机推荐
- Android 用ViewFlipper实现跑马灯效果的公告提示
1.代码部分private void initViewFlipper(final HomepageListModel.Notice notice) { for (int i = 0; i < n ...
- 一、什么是Velocity及简单示例
1.velocity简介: velocity是一个java模板引擎技术,任何人可以使用这种简单而又强有力的模板语言去获取java对象. 在使用Velocity进行web开发时,web开发人员和j ...
- 嵊州普及Day3T4
利内罗女士准备来到意大利进行修行.意大利由 n 个城市和 m 条道路构成,道路是双向的.到达第 i 个城市时,她可以取得该城市的全部信仰,并获得 ai 点能力提升,但因为在一个城市可以取得的信仰有 ...
- 有关WordPress的Rss导入指南
我是用cublog转过来.有一个软件博客备份软件(blog_backup)可以备份那个的blog.我用他备份后导出成rss2的文件.但我导入了很多次不成功.后来发现,原来blog_backup导出的格 ...
- 题解 UVA10298 【Power Strings】
此题我写的是后缀数组SA解法,如果不会后缀数组的可以跳过本篇blog了. 参考文献:罗穗骞 2009集训队后缀数组论文 前记 最近学后缀数组,肝了不少题,也分出了后缀数组的几个题型,看这题没有后缀数组 ...
- 8张图片掌握JS原型链
- MQTT 协议学习:001-搭建MQTT通信环境,并抓包测试
背景 目的:了解MQTT 通信的有关概念与流程:方便推算某些数据与文档描述是否一致. 为了能够在保证学习质量的前提下,降低配置环境的门槛,我们将服务器搭建在windwos中,实行内网间的MQTT协议访 ...
- 【C】揭秘rand()函数;
原文地址:http://www.cnblogs.com/ngnetboy/archive/2012/11/23/2784078.html 相信只要是程序猿都会知道rand()函数是用来取随机数的一个库 ...
- 数据交互与ajax
在Long Long Ago,那个前端还是一个切图仔的年代,那时的页面根本没有js,前端的api非常的少,页面的所有数据都来自服务器渲染,任何的页面操作都会提交form表单请求刷新页面,直到那一天,浏 ...
- Day8 - D - Multiplication Table CodeForces - 448D
Bizon the Champion isn't just charming, he also is very smart. While some of us were learning the mu ...