hdu5976贪心乘法逆元
题意:
给定一个自然数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贪心乘法逆元的更多相关文章
- Bzoj2154 Crash的数字表格 乘法逆元+莫比乌斯反演(TLE)
题意:求sigma{lcm(i,j)},1<=i<=n,1<=j<=m 不妨令n<=m 首先把lcm(i,j)转成i*j/gcd(i,j) 正解不会...总之最后化出来的 ...
- 51nod1256(乘法逆元)
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...
- 【板子】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 ...
- HDU 5651 计算回文串个数问题(有重复的全排列、乘法逆元、费马小定理)
原题: http://acm.hdu.edu.cn/showproblem.php?pid=5651 很容易看出来的是,如果一个字符串中,多于一个字母出现奇数次,则该字符串无法形成回文串,因为不能删减 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- HDU 1452 (约数和+乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1452 题目大意:求2004^X所有约数和,结果mod 29. 解题思路: ①整数唯一分解定理: 一个 ...
- HDU 1576 (乘法逆元)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1576 题目大意:求(A/B)mod 9973.但是给出的A是mod形式n,n=A%9973. 解题思 ...
- 51Nod 1256 乘法逆元 Label:exgcd
1256 乘法逆元 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出2个数M和N(M < N),且M与N互质,找出一个数K满足0 < K < N且K ...
- hdu 2669 Romantic (乘法逆元)
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
随机推荐
- TDD中的单元测试
TDD中的单元测试写多少才够? 测试驱动开发(TDD)已经是耳熟能详的名词,既然是测试驱动,那么测试用例代码就要写在开发代码的前面.但是如何写测试用例?写多少测试用例才够?我想大家在实际的操作过程 ...
- ASP.NET MVC扩展点
16个ASP.NET MVC扩展点[附源码] 1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将 ...
- 一个快速找第k+1小的算法
public static int randomSelect(int[] A, int k) { return randomSelectDo(A, 0, A.L ...
- 设计模式20---设计模式之备忘录模式(Memento)(行为型)
1.讲解备忘录模式 备忘录模式(Memento Pattern)又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式. 1.1定义 在不破坏封 ...
- ASP.NET服务器端事件利用MARQUEE实现正在处理效果
前言:ASP.NET同仁们应该都遇到过当触发一个比较耗时的服务器端事件时,页面会处在一个等待的状态(即假死状态),用户体验非常不好,很容易造成用户二次点击,造成重复提交.至于解决方案自然是有的(问go ...
- JSON.NET基本使用
序列化一个对象 public static string ToJson( object obj) { string json = JsonConvert .SerializeObject(obj); ...
- OpenStack调研
OpenStack调研:OpenStack是什么.版本演变.组件关系(Havana).同类产品及个人感想 一点调研资料,比较浅,只是觉得部分内容比较有用,记在这里: 首先,关于云计算,要理解什么是SA ...
- IOS学习之路(代码实现自动布局)
1.将一个试图放置在其父视图的中央位置,使用限制条件. 2.创建两个限制条件:一个是将目标视图的 center.x 位置排列在其父视图的 center.x 位置,并且另外一个是将目标视图的 cente ...
- Mongodb 集群搭建以及常见错误
Mongodb 集群搭建以及常见错误 1 关于Replica Sets +Sharding(主从复制加分片)搭建,不这详细去说,网上有很多,大部分的例子就三台服务器之间做主从复制,分2个shard,架 ...
- Reeder Web版
Reeder Web版 访Reeder界面效果 一直很欣赏触控手势的代码实现,所以最近折腾了个Javascript触控手势库--JTouch,效果还有诸多不完善之处,苦于硬件设备不完善,针对ie10的 ...