题意:

给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(A_i\),\(N=\prod\limits_{i=1}^{n}i^{A_i}\)。求\(N\)的所有约数的乘积。

分析:

首先还是将\(N\)质因数分解,\(N=\prod\limits_{i=1}^{k}p_i^{e_i}\)。

考虑素因子\(p_a\)对结果的贡献,含有且仅含有\(p_a^x\)的约数有\(\frac{\prod\limits_{i=1}^{k}e_i+1}{e_a+1}\)个。

所以\(p_a\)对答案贡献了\(\frac{e_a(e_a+1)}{2} \cdot \frac{\prod\limits_{i=1}^{k}e_i+1}{e_a+1}\)次,也可以继续化简得到\(\frac{e_a\prod\limits_{i=1}^{k}e_i+1}{2}\)。

指数太大,根据费马小定理,我们可以对\(MOD-1\)取模。

指数第一部分有个分母\(2\),由于不能计算\(MOD-1\)的逆元,所以可以先对\(2(MOD-1)\)取模。

第二部分可以通过计算前缀后缀积来避免除法。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long LL;
const LL MOD = 1000000007;
const int maxn = 100000 + 10; LL pow_mod(LL a, LL n) {
LL ans = 1;
while(n) {
if(n & 1) ans = ans * a % MOD;
a = a * a % MOD;
n >>= 1;
}
return ans;
} int pcnt, prime[maxn], pos[maxn];
bool vis[maxn]; void preprocess() {
for(int i = 2; i < maxn; i++) {
if(!vis[i]) prime[++pcnt] = i;
for(int j = 1; j <= pcnt && i * prime[j] < maxn; j++) {
vis[i * prime[j]] = true;
if(i % prime[j] == 0) break;
}
}
for(int i = 1; i <= pcnt; i++) pos[prime[i]] = i;
} int n;
LL p[maxn];
LL pre[maxn], suf[maxn]; int main()
{
preprocess(); while(scanf("%d", &n) == 1) {
memset(p, 0, sizeof(p)); for(int i = 1; i <= n; i++) {
int a; scanf("%d", &a);
if(i == 1 || a == 0) continue;
int t = i;
for(int j = 1; j <= pcnt; j++) {
if((LL) prime[j] * prime[j] > t) break;
if(t % prime[j] == 0) {
int cnt = 0;
while(t % prime[j] == 0) {
t /= prime[j];
cnt++;
}
p[j] += (LL)cnt * a;
p[j] %= 2 * (MOD - 1);
}
}
if(t > 1) { p[pos[t]] += a; p[pos[t]] %= 2 * (MOD - 1); }
} int tot = pcnt;
while(tot > 1 && p[tot] == 0) tot--;
pre[0] = suf[tot+1] = 1;
for(int i = 1; i <= tot; i++) pre[i] = pre[i-1] * (p[i] + 1) % (MOD - 1);
for(int i = tot; i >= 1; i--) suf[i] = suf[i+1] * (p[i] + 1) % (MOD - 1); LL ans = 1LL;
for(int i = 1; i <= tot; i++) {
LL ta, tb;
if(p[i] % 2 == 0) ta = p[i]/2%(MOD-1)*((p[i]+1)%(MOD-1))%(MOD-1);
else ta = (p[i]+1)/2%(MOD-1)*(p[i]%(MOD-1))%(MOD-1);
tb = pre[i-1] * suf[i+1] % (MOD - 1);
ta = ta * tb % (MOD - 1);
ans = ans * pow_mod(prime[i], ta) % MOD;
} printf("%lld\n", ans);
} return 0;
}

HDU 5525 Product 数论的更多相关文章

  1. hdu 5525 Product 数论算贡献

    Product Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Proble ...

  2. HDU 5525:Product 欧拉定理

    Product  Accepts: 21  Submissions: 171  Time Limit: 6000/3000 MS (Java/Others)  Memory Limit: 131072 ...

  3. hdu GuGuFishtion 6390 数论 欧拉函数

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6390 直接开始证明: 我们设…………………………………….....…...............………… ...

  4. HDU 1299 基础数论 分解

    给一个数n问有多少种x,y的组合使$\frac{1}{x}+\frac{1}{y}=\frac{1}{n},x<=y$满足,设y = k + n,代入得到$x = \frac{n^2}{k} + ...

  5. HDU 5317 RGCDQ (数论素筛)

    RGCDQ Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status ...

  6. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. HDU 1722 Cake (数论 gcd)(Java版)

    Big Number 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1722 ——每天在线,欢迎留言谈论. 题目大意: 给你两个数 n1,n2 . 然后 ...

  8. L - LCM Walk HDU - 5584 (数论)

    题目链接: L - LCM Walk HDU - 5584 题目大意:首先是T组测试样例,然后给你x和y,这个指的是终点.然后问你有多少个起点能走到这个x和y.每一次走的规则是(m1,m2)到(m1+ ...

  9. HDU 5666 Segment 数论+大数

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5666 bc(中文):http://bestcoder.hdu.edu.cn/contests ...

随机推荐

  1. 3D旋转仿伪3D立体效果,手机端

    偶然在书上看到这段代码,感觉很舒服,直街附代码吧,原生JS.手机端旋转效果仿立体效果. 纯JS代码足够了. var img=document.createElement('img'); img.set ...

  2. 【0 基础学Dojo】第【1】篇 HelloWord

    打开dojo 官网首页 http://dojotoolkit.org/,我们看到 点击get dojo  你将得到下载Dojo 的不同方式 2,点击下面方式下载, 解压后 新建myTest.html, ...

  3. WPF 动态加载主题由zip

    经典主题的方式 主题战略 加载速度 本机支持 (不需要额外的代码) 支持代码为主题 (捆绑代码 & 资源成单独的文件) 支持资源层次结构中导航 动态加载 动态卸载 轻松地编辑和编译 (不需要安 ...

  4. 查询获取所有数据库名及数据库中表的集合、数据库连接字符串(类生成器,暂时支持mysql,sql server,后期有oracle再更新)

    现所在公司做项目开发时,经常会自己创建model类,网上的生成器也很多,完全满足自己的不太现实,所以感觉自己做一个更有底气,主要针对过程中的一些语句进行整理,也供其他人学习参考. 连接字符串: mys ...

  5. 常用API(正则表达式、Date、DateFormat、Calendar)

    常用API 今日内容介绍 u 正则表达式 u Date u DateFormat u Calendar 第1章 正则表达式 1.1 正则表达式的概念 正则表达式(英语:Regular Expressi ...

  6. (笔记)快速入门PADS logic 到 layout

    以前从未接触过画板,先是硬着头皮边学边操作<Layout2007中文教程之PADS_Logic>,刚好在中秋节前把这个教程从头到尾通学了一遍,随后感觉这个教程有了方方面面但没有工程的系统性 ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:2.技术简介之MinaFilter(1)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Filter filter:过滤器?(不知道是不是这么翻译,算了知道意思就好了╮(╯▽╰)╭),这种东西在很多语言中 ...

  8. 5分钟部署一个Hello World Servlet到CloudFoundry

    首先从我的Github下载我写好的hello world Servlet到本地. 安装Maven,然后执行命令行mvn clean install,确保build成功,在项目根目录的target文件夹 ...

  9. 使用ABAP批量下载有道云笔记中的图片

    Jerry喜欢用有道云笔记这款软件做自己的知识管理和知识体系的构建. 当您看到一篇好的有道云笔记分享时,可能会想将其精美的图片下载到本地.作为程序猿,我们不会去手动一张张下载.写个程序帮我们自动下载吧 ...

  10. UVA 1442 Cave 洞穴 (贪心+扫描)

    题意:有一个洞穴,每个位置有一个底的高度p[i],和对应顶的高度s[i],要往里面尽量放燃料,要求燃料不能碰到顶,可以无限接近. 题解:制约燃料储放的就是顶的高度了,分别求出设当前储放位置的向两边的延 ...