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的单词最后看博客才知道是用给 ...
随机推荐
- 布局文件中fill_parent和match_parent有什么区别?
1)fill_parent设置一个构件的布局为fill_parent将强制性地使构件扩展,以填充布局单元内尽可能多的空间.这跟Windows控件的dockstyle属性大体一致.设置一个顶部布局或控件 ...
- 《Redis深度历险:核心原理和应用实践》千帆竞发——分布式锁
- 题解:luogu P3909
这个题拖了快三个月了,只因缺个快速乘(气愤.jpg). 题目链接:P3909 异或之积 你确定没人用前缀和,后缀和吗? 蒟蒻想法与众不同! 我们实验\(A[]={1,2,3,4}\). 这里计不乘6时 ...
- 题解 LG P2264
这是题解P2264 先讲一下Trie,其实Trie也名前缀树,就是说:如果Trie中某串是某串的前缀,那么我们可以共用这个串也就是这样: 插入h.hk.jc,jcfa 那么,h节点会给h和hk共用,j ...
- mycat 主从复制,读写分离,
1.mycat 主从复制 https://blog.csdn.net/qq_35992900/article/details/80599976 2.mycat 读写分离 https://blog.cs ...
- JDBC--使用beanutils工具类操作JavaBean
1.在JavaEE中,Java类的属性通过getter,setter来定义: 2.可使用BeanUtils工具包来操作Java类的属性: --Beanutils是由Apache公司开发,能够方便对Be ...
- 发送短信-----用restful 校验规则
我们的需求如下 1. 获取手机号 . 手机格式校验 . 生成随机验证码 . 验证码发送到手机上 . 把验证码+手机号保留(30s过期) 复习 我们在有表的情况下的序列化 class MessageSe ...
- 用 ConfigMap 管理配置【转】
Secret 可以为 Pod 提供密码.Token.私钥等敏感数据:对于一些非敏感数据,比如应用的配置信息,则可以用 ConfigMap. ConfigMap 的创建和使用方式与 Secret 非常类 ...
- gojs 部分功能实现
最近做的项目用到了gojs,使用了一段时间发现其功能特别强大,先记录下目前自己用到的把 1. 初始化画布 myDiagram = $(go.Diagram, "myDiagramDiv&qu ...
- 51nod 1765 谷歌的恐龙
一开始看到了期望吓半死..然后弱弱的写了一下式子.设∑是出去m项之后的和,∑' 是m项的和. E=(n/m)*(∑'/m)+(n/m)*((n-m)/n)*(∑'/m+∑/(n-m))+(n/m)*( ...