题意:

给出一个长度为\(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. TestNG ABC

    TestNG ABC 资源 官网 :http://testng.org/doc/index.html Maven示例 <dependency>             <groupI ...

  2. springMVC数据校验与单文件上传

    spring表单标签:    <fr:from/> 渲染表单元素    <fr:input/>输入框组件    <fr:password/>密码框组件标签    & ...

  3. 报错:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xxx.entity.PersonEntity

    报错:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xxx.entity.PersonEntity 代 ...

  4. Node.js 历史

    Node.js 是在 2009年5月份创建的,是属于典型的 Git 和 GitHub 时代最初孕育的项目.另外需要先说明一点,那就是回顾 Node.js 的历史,并不是仅仅为了给大家回味,而是想找到在 ...

  5. Promise 对象与Generator 函数

    异步编程的方法,大概有下面四种: 回调函数 事件监听 发布/订阅 Promise 对象 传统的编程语言,早有异步编程的解决方案(其实是多任务的解决方案).其中有一种叫做"协程"(c ...

  6. Redis数据库1

    一.启动服务 #进入redis安装文件夹 cd /usr/local/redis/ #开启服务端(后端开启) ./bin/redis-server ./redis.conf #开启客户端 ./bin/ ...

  7. 如何清除SharePoint Server 配置缓存

    日常运维中您可能需要清除SharePoint 2010/2013/2016中的过期配置缓存.例如,有时计时器作业往往会卡住,并在这种情况下清除缓存.您可以手动清除SharePoint配置缓存或者使用P ...

  8. Python+selenium之获取请求信息

    basicConfig()所捕获的log信息.不过其开启的debug模式只能捕获到客户端像服务器发送的post()请求,而无法获取服务器所返回的应答信息. from random import ran ...

  9. input输入大于0的小数和整数

    <input onkeyup="num(this)"onbeforepaste="num(this)"> <script src='jquer ...

  10. MFC:Unicode和多字节字符集下 CString和char的转化(MFC中)

    2011-05-16 00:10 1166人阅读 评论(0) 收藏 举报 mfcdelete Unicode下 CString转TCHAR TCHAR* szMsg = new TCHAR[wcsle ...