原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5976
参考博客:https://blog.csdn.net/qq_34374664/article/details/53466435
题意:将一个数x拆成a1+a2+a3+……,ai不等于aj,求最大的a1a2a3*……

思路:这里面会用到一个结论,满足题意的要求的数字一定是若干段连续的数字,然后只需要预处理出前缀和(寻找最大的t,使得sum[t]&lt;=x&lt;sum[t+1]sum[t]&lt;=x&lt;sum[t+1]sum[t]<=x<sum[t+1])前缀积(计算结果).然后对于个别中间不存在的数字,除掉这个数字,也就是乘上这个数字的逆元就行了.

#include <bits/stdc++.h>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endlusing namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const ll mod = 1e9 + 7;ll Pow(ll base, ll n) {ll res = 1;while (n) {if (n & 1) res = res * base % mod ;n >>= 1;base = base * base % mod;}return res;
}
ll sum[maxn], mul[maxn], MX;
void init() {//预处理sum[1] = 0;//sum数组是不计算1的前缀和,所以是从2开始的mul[1] = 1;for (int i = 2; i <= maxn; i++) {sum[i] = sum[i - 1] + i;mul[i] = mul[i - 1] * i;mul[i] %= mod;if (sum[i] >= 1e9) {MX = i;return;}}
}
int T;
ll x;
int main() {init();scanf("%d", &T);while (T--) {scanf("%lld", &x);if (x == 1) {//对1进行特判printf("1\n");continue;}int t = lower_bound(sum, sum + MX, x) - sum;if (sum[t] > x) t--;//t是最大的满足sum[t]<=x<sum[t+1]ll rest = x - sum[t];if (rest == t) {ll ans = mul[t + 2] * Pow(2, mod - 2) % mod * Pow(t + 1, mod - 2) % mod;printf("%lld\n", ans % mod);} else {ll ans = mul[t + 1] * Pow(t + 1 - rest, mod - 2) % mod;printf("%lld\n", ans % mod);}}return 0;
}

HDU 5976 Detachment(数学+结论)相关推荐

  1. HDU 5976 Detachment

    这道题目是向这位博主学习的,链接贴出来:☆HDU 5976 Detachment 详细题解(贪心+逆元+前缀和,积),讲的很细致,很感谢: 思路: 1.题意是将数x分成若干个正整数和,使得这些整数的乘 ...

  2. HDU 5976 Detachment(拆分)

    HDU 5976 Detachment(拆分) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/ ...

  3. HDU - 5976 Detachment(贪心思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5976 题意:把一个数拆成若干个不相同的数之和,问这些数的乘积最大是多少. 思路:一般要使乘积最大,那么 ...

  4. HDU 5976 Detachment 题解(贪心+逆元+前缀和,积)

    个人体会:无脑取模,最为致命!因为把存放前缀和的数组取了模,导致一些本来不等的元素变成了相同的元素,二分搜索出错...而且C++会T,G++就ac了.. http://acm.hdu.edu.cn/s ...

  5. HDU - 5976 Detachment(逆元)

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

  6. HDU 5976 Detachment 逆元

    题意: 把一个数分解分解成若干个不相等的数,怎么分解使得这若干个数的积最大,输出这个积mod(1e+9) 分析: 考虑x=20的情况 如果不分解 那么 max ans===>20 如果分解成2个 ...

  7. 10大反直觉的数学结论

    我是谁? 我在哪? 反直觉的事实有时候甚至骗过了最好的数学家.有些数学结论,往往会跟我们生活中的经验背道而驰. 今天,超模君就来跟大家讲讲10个反直觉的数学结论吧. 1 生日悖论 假设房间里有23人, ...

  8. 十大反直觉的数学结论

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|深度学习这件小事 反直觉的事实有时候甚至骗过了最好的数学 ...

  9. HDU Problem - 5976 Detachment(逆元,阶乘打表,数学)

    题目链接 Problem Description In a highly developed alien society, the habitats are almost infinite dimen ...

最新文章

  1. python发送文件给微信好友_Python定时自动给微信好友发送天气预报
  2. TreeList右键菜单功能
  3. matlab 读写其他格式数据文件(excel)
  4. 如何成为一个出色的敏捷开发者?
  5. IP地址,子网掩码,默认网关,路由,形象生动阐述
  6. java多线程 异常处理_Java8多线程ForkJoinPool:处理异常
  7. [剑指offer]面试题第[53-1]题[JAVA][在排序数组中查找数字-1][二分法][暴力法]
  8. 这本零差评且有趣的Python算法书有点火~
  9. PL/SQL异常处理
  10. 集合 (二) ----- Map集合详解
  11. 从入门到入土:Nessus出击:使用nessus扫描某台靶机
  12. Dynamips 7200
  13. 面试中遇到的java笔试题
  14. JavaScript页面刷新的所有方法
  15. 风口来了第二期——电子科学与技术专业现状和前景介绍分享
  16. 基于JavaWeb的背单词系统的设计与实现
  17. OWASP十大漏洞之一
  18. HMS Core 5,面试必问知识点
  19. Lesson 15 Fifty pence worth of trouble
  20. Redis集群系列一 —— AKF拆分原则

热门文章

  1. 软件卸载不了怎么办?快用IObit Uninstaller Pro软件卸载大师
  2. 一牛网:PCB layout设计培训:免费试听,可预约报名
  3. sort在c语言中的作用,c语言中sort的用法详解.docx
  4. 解决maven打包时手动添加的依赖jar包打不进去的情况
  5. windows android 对比度,色彩对比度饱和度基本测试
  6. Graphql入门_0
  7. python离线安装第三方库whl_详细说明如何在pycharm不联网的情况下,离线安装第三方库及依赖包(如sklearn)...
  8. 记录一次 Liferay 7.X 中弹出窗口的简单使用
  9. 作为POLK的老粉,以亲身经验来说说普乐之声音响怎么样这个问题
  10. GE可能会出售其工业软件业务的股份