博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdoj 5976 Detachment(逆元)
阅读量:5094 次
发布时间:2019-06-13

本文共 2689 字,大约阅读时间需要 8 分钟。

In a highly developed alien society, the habitats are almost infinite dimensional space. 
In the history of this planet,there is an old puzzle. 
You have a line segment with x units’ length representing one dimension.The line segment can be split into a number of small line segments: 
a1,a2a1,a2, … (x= a1+a2a1+a2+…) assigned to different dimensions. And then, the multidimensional space has been established. Now there are two requirements for this space: 
1.Two different small line segments cannot be equal ( aiajai≠aj when i≠j). 
2.Make this multidimensional space size s as large as possible (s= a1a2a1∗a2*...).Note that it allows to keep one dimension.That's to say, the number of ai can be only one. 
Now can you solve this question and find the maximum size of the space?(For the final number is too large,your answer will be modulo 10^9+7) 

InputThe first line is an integer T,meaning the number of test cases. 

Then T lines follow. Each line contains one integer x. 
1≤T≤10^6, 1≤x≤10^9OutputMaximum s you can get modulo 10^9+7. Note that we wants to be greatest product before modulo 10^9+7.Sample Input

14

Sample Output

4
1 /* 2 题意:给你一个x,找出若干个不同的整数使得和为x,积要最大, 3 然后求出积mod后的值 4 题解:对于一个数,拆的因子越小,积越大,因为当a+b=n时 5 根据二次函数性质知道,当b=a=n/2时,乘积最大,现在不能相等 6 我们只要靠近即可 7 所以我们可以求2+3+...+n+s=x,先求出n即2+3+...+n
<2+3+...+n+(n+1) 8 然后将某个数向右平移s个单位变为n+1即可 9 处理出前缀积mod即可10 ps:因为要把某个数变为另一个数时要用到除法,所以要用逆元11 不要+1,因为1对乘积没影响,而且占用和,所以没用12 */13 #include
14 #include
15 #include
16 #include
17 using namespace std;18 #define mod 100000000719 typedef long long ll;20 ll num[100005],top=0,ans[100005],ni[100005];21 void init(){22 num[++top]=1;23 ans[top]=1;24 ll i,now=0,mul=1;25 ni[top]=1;26 for(i=2;now<=1000000000;i++){27 now+=i;28 num[++top]=now;//前缀积29 mul=mul*i%mod;30 ans[top]=mul;31 ni[i]=(mod-mod/i)*ni[mod%i]%mod;//逆元32 }33 }34 int main(){35 init();36 ll t;37 scanf("%lld",&t);38 while(t--){39 ll x;40 scanf("%lld",&x);41 ll s=lower_bound(num+1,num+1+top,x)-num;//找n42 if(num[s]==x){43 printf("%lld\n",ans[s]);44 }45 else{46 s--;47 ll need=x-num[s],la=ans[s];48 if(need==s){
//如果s==n 那就把2拿过来,因为没有149 la=la*ni[2]%mod;50 la=la*(s+2)%mod;51 }52 else{53 la=la*ni[s+1-need]%mod;54 la=la*(s+1)%mod;55 }56 printf("%lld\n",la);57 }58 }59 return 0;60 }

 

 

转载于:https://www.cnblogs.com/z-712/p/7324504.html

你可能感兴趣的文章
Python内置函数(29)——help
查看>>
大数据学习系列(8)-- WordCount+Block+Split+Shuffle+Map+Reduce技术详解
查看>>
Mysql性能调优
查看>>
getElement的几中属性介绍
查看>>
设计器 和后台代码的转换 快捷键
查看>>
STL容器之vector
查看>>
数据中心虚拟化技术
查看>>
复习文件操作
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
第二阶段冲刺-01
查看>>
BZOJ1045 HAOI2008 糖果传递
查看>>
JavaScript 克隆数组
查看>>
eggs
查看>>
python3 生成器与迭代器
查看>>
CPU,寄存器,一缓二缓.... RAM ROM 外部存储器等简介
查看>>
git .gitignore 文件不起作用
查看>>
digitalocean --- How To Install Apache Tomcat 8 on Ubuntu 16.04
查看>>
【题解】[P4178 Tree]
查看>>
cer证书签名验证
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>