1、HDU 5976 Detachment  

2、题意:给一个正整数x,把x拆分成多个正整数的和,这些数不能有重复,要使这些数的积尽可能的大,输出积。

3、总结:首先我们要把数拆得尽可能小,这样积才会更大(当然不能拆1)。所以容易想到是拆成2+3+...+n+s=x,先求出n即2+3+...+n<x<2+3+...+n+(n+1),然后将某个数向右平移s个单位变为n+1即可。注意:(1)预处理出前缀和,前缀积。(2)将某个数移到n+1,要除这个数再乘n+1,这里要用逆元,也要预处理出来。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 1e5+;
const ll mod = 1e9+; int sum[N],inv[N];
ll mul[N];
//int tot;
void init()
{
sum[]=;
mul[]=inv[]=;
F(i,,N) {
sum[i]=i+sum[i-];  //前缀和
mul[i]=i*mul[i-]%mod; //前缀积
inv[i]=(mod-mod/i)*inv[mod%i]%mod; //O(n)时间内求逆元,要求mod是素数
//tot=i;
}
} int main()
{
int T,x;
scanf("%d", &T);
init();
while(T--)
{
scanf("%d",&x);
if(x<) printf("%d\n", x);
else
{
/* int l=lower_bound(sum+1,sum+1+tot,x)-sum; //可以直接函数二分,找出第一个大于或等于x的位置
if(sum[l]==x) { printf("%d\n", mul[l]); continue; }
l--; */ int l=,r=N,mid=(l+r)>>; //特注:二分写法,mid先定义,不要在while里面
while(l+<r) {
//mid=(l+r)>>1; //注:一开始这样写,错得莫名其妙,还是养成习惯,先在上面定义mid
sum[mid]>x ? r=mid : l=mid;
mid=(l+r)>>;
}
ll ans;
int k,num;
num=x-sum[l], k=l+-num;
if(+num>l) ans=mul[l]*inv[]%mod*(+num)%mod;
else ans=mul[l]*inv[k]%mod*(l+)%mod;
printf("%lld\n", (ans+mod)%mod);
}
} return ;
}

HDU 5976 数学,逆元的更多相关文章

  1. HDU 5976 数学

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. HDU 5976 Detachment(拆分)

    HDU 5976 Detachment(拆分) 00 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)   Problem D ...

  3. HDU 5984 数学期望

    对长为L的棒子随机取一点分割两部分,抛弃左边一部分,重复过程,直到长度小于d,问操作次数的期望. 区域赛的题,比较基础的概率论,我记得教材上有道很像的题,对1/len积分,$ln(L)-ln(d)+1 ...

  4. 2016 ACM/ICPC Asia Regional Shenyang Online 1003/HDU 5894 数学/组合数/逆元

    hannnnah_j’s Biological Test Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K ...

  5. HDU - 5976 Detachment(逆元)

    题意:将一个数x拆成a1+a2+a3+……,ai不等于aj,求最大的a1*a2*a3*……. 分析: 1.预处理前缀和前缀积,因为拆成1对乘积没有贡献,所以从2开始拆起. 2.找到一个id,使得2+3 ...

  6. HDU 1576 (乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...

  7. HDU 5976 Detachment 打表找规律

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5976 Detachment Time Limit: 4000/2000 MS (Java/Other ...

  8. HDU 5651 组合+逆元

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5651 题目意思我看了半天没读懂,一直以为是回文子串又没看见substring的单词最后看博客才知道是用给 ...

  9. HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)

    Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

随机推荐

  1. enum 与 enum class

    c++11中引入了新的枚举类型---->强制枚举类型 // unscoped enum: enum [identifier] [: type] {enum-list};  // scoped e ...

  2. JAVA基础学习——1.1 环境搭建 之jdk安装,环境变量配置 (系统Win10,64bit)

    大学里虽然老师教过JAVA,但我没学.后来工作了,断断续续的也碰到了JAVA的项目,都是拉过来就干的节奏.也没有好好系统的学习一下. 从今天开始系统学习整理一下JAVA,以后再碰到JAVA项目的时候, ...

  3. MicrosoftWord2013基本用法

    MicrosoftWord2013基本用法 Word联机使用 自定义工作区 单击"文件"选项,单击"自定义功能区".显示的就是我们编辑文档时上方的工具栏所有选项 ...

  4. Java算法之递归打破及在真实项目中的使用实例

    开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归 ...

  5. from表单如果未指定action,submit提交时候会执行当前url

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  6. SQL删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  7. iOS JSON、NSDictionary互转

    #import "myCode.h" @implementation myCode /*! * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonS ...

  8. LINQ

    lambda表达式: LINQ to Object: 参考:http://www.cnblogs.com/leon-y-liu/articles/3575009.html LINQ to XML: u ...

  9. Python中内置数据类型list,tuple,dict,set的区别和用法

    Python中内置数据类型list,tuple,dict,set的区别和用法 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python的四个内置数据类型功不可没,他们即是list, ...

  10. ubuntu 报错: The system is running in low-graphics mode

    出错原因不知为何,apt-get install --reinstall unity-greeter 不起作用. 试了一下,这样居然有效: cd /etc/X11 sudo cp xorg.conf. ...