hdu 5976 Detachment题目连接

题意:

给定一个自然数x,让你给出一种拆分方式n=a1+a2+...(ai≠aj),使得每个小部分的乘积s=a1*a2*...最大

解题思路:

我们要乘积最大,那么我们把n尽可能的拆分,如果题目不要求ai≠aj,那么我们将x拆分成什么最好呢?显然拆成2和3(2为偶数,3为奇数,2x+3y可以表示大于1的所有正整数)是最好的,顺便提下3最多的时候最优,为什么不是2,将,6拆成3个2乘积为8,而将6拆成3乘积为9,(不会证)

那这样我们就把n分成x个2和y个3,如果k=n-2x-3y>0&&k<2怎么办,此时k=1,把k放在哪里可以得到最优解呢?

把k放在2上可以得到最优解。假设n=6,那么拆成一个2一个3,k=1,将k放在2上(2+k)*3增加了3*k,如果放在3上(3+k)*2增加了2*k,

那么现在题目是要求ai≠aj

我们将n分成2,3,4,5,6,7,8,。。。。。从2开始以递增分(可以分的话)

我们设sum[max]为前缀和数组,那么当sum[i]>n时,k=n-sum[i-1];

将k怎么放呢?(把k看成k个1)

我们先放第一个1,放在谁哪里呢?显然放在2那,前面证过,所以为了最优我们尽可能的放在2,

但当2+k<i,那么就会出现拆分的数重复出现的情况,所以能将k全部放在2是在2+k>=i的情况下

如果在2+k<i的情况下该怎么放,因为此时2+k<i所以放任何个数的1都会出现重复的数,此时我们就要考虑3了,如果3+k>=i,我们全部放在3,

如果3+k<i,我们考虑4,以此规则继续。。。。

我们现在知道了,该怎么放多出来的k(如果有的话),那么最优乘积怎么求呢?

我们要除掉k放在的那个数i,再乘以(k+i)

为了让前缀乘不爆掉long long,我们取余,为了取余后不影响结果我们用乘法逆元来求最优乘积。

我的乘法逆元博客

用二分查找找i

以下是代码实现

 #include<iostream>
#include<cstdio>
#include<algorithm>
#define max 1000000000
const __int64 MOD=;//不能用define定义MOD否则会出错,define是一个函数
using namespace std;
__int64 f[];
int sum[];
int inv[];
void del()
{
inv[]=;f[]=;sum[]=;
for (int i = ; i<; i++)
{
inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;//乘法逆元
f[i]=(f[i-]*i)%MOD;//前缀乘(在取余MOD的环境下,配合后面的乘法逆元)
sum[i]=sum[i-]+i;//前缀和(从2开始)
}
//printf("%d %d %d xxx\n",inv[2],inv[3],inv[1]);
return;
}
int main()
{
int T,n,i,j,k,l,r,mid;__int64 ans;
while(scanf("%d",&T)!=EOF)
{
del();
while(T--)
{
scanf("%d",&n);
if(n<)printf("%d\n",n);
else
{
l=;r=;mid=(l+r)>>;
while(l+<r)
{
if(sum[mid]>n)r=mid,mid=(r+l)>>;//r定义为开,不取状态
else l=mid,mid=(r+l)>>;//l定义为闭,取状态
}
k=n-sum[l];//printf("%d %d %d xx",sum[l],k,inv[l+1-k]);
if(+k>l)ans=f[l]*inv[]%MOD*(k+)%MOD,printf("%I64d\n",(ans+MOD)%MOD);
else
ans=f[l]*inv[l+-k]%MOD*(l+)%MOD,printf("%I64d\n",(ans+MOD)%MOD);
}
}
}
return ;
}

hdu5976贪心乘法逆元的更多相关文章

  1. Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)

    题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...

  2. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  3. 【板子】gcd、exgcd、乘法逆元、快速幂、快速乘、筛素数、快速求逆元、组合数

    1.gcd int gcd(int a,int b){ return b?gcd(b,a%b):a; } 2.扩展gcd )extend great common divisor ll exgcd(l ...

  4. HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)

    原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...

  5. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  6. HDU 1452 (约数和+乘法逆元)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...

  7. HDU 1576 (乘法逆元)

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

  8. 51Nod 1256 乘法逆元 Label:exgcd

    1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...

  9. hdu 2669 Romantic (乘法逆元)

    Romantic Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

随机推荐

  1. Effective C++(11) 自我赋值(a=a)时会发生什么?

    问题聚焦: 自我赋值看似有点愚蠢的行为,其实总会发生的 首先:它是合法的, 其次,它不一定是安全的, 再次,它有时候不是那么明显. 先看一个Demo class Widget { ... }; Wid ...

  2. Web API实现POST报文的构造与推送

    ASP.NET Web API实现POST报文的构造与推送   毕设和OAuth协议相关,而要理解OAuth协议就必须理解HTTP GET/POST方法.因此研究了一下如何使用Web API或MVC构 ...

  3. 开发框架(OrchardNoCMS)介绍(一)

    基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(一) Orchard CMS是针对CMS开发的,对于很多开发需求来说,内容管理这块儿可能并不需要,而需要它的模块式开发 ...

  4. 随手复习一下委托:delegate

    先骂个街,天儿太闷了…… 随手复习一下委托,delegate 是一种函数指针,是 .net 提供的一种安全的函数指针,翻译的也很贴切,像是委托人,又像代理人,通过“委托”来执行一些函数而不是直接调用它 ...

  5. JS之For---in 语句

    下面说一下for… in语句.可直接把下面的代码复制到浏览器的控制台或Node环境下去执行. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //用来快速迭代对象. var o ...

  6. socket网络编程快速上手(二)——细节问题(5)(完结篇)

    6.Connect的使用方式 前面提到,connect发生EINTR错误时,是不能重新启动的.那怎么办呢,是关闭套接字还是直接退出进程呢?如果EINTR前,三次握手已经发起,我们当然希望链路就此已经建 ...

  7. Oracle误删恢复

    query deleted datarows: select * from 表名 as of timestamp to_timestamp('删除时间点','yyyy-mm-dd hh24:mi:ss ...

  8. addEventListener和attachEvent以及element.onclick的区别

    addEventListener和attachEvent以及element.onclick的区别 attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on&qu ...

  9. QQ高仿版

    可在广域网部署运行的QQ高仿版 -- GG叽叽(源码)   前段时间看到园子里有朋友开发了QQ高仿版的程序,我也非常有兴趣,以前一直有个做即时聊天程序的梦,趁这段时间工作不是很忙,就开始动手来做这个事 ...

  10. 设计模式之 - 工厂方法模式 (Factory Method design pattern)

    1. 模式意图:  定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 2. 别名(Virtual Constructor) 3. 结构 4. 工厂方法模式C ...