题意:

给出一个长度为\(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. C# 加密、解密函数

    #region ========加密======== /// <summary> /// 加密 /// </summary> /// <param name=" ...

  2. Spring连接数据库

    public class Book { private int bookid; private String bookname; private String bookauthor; private ...

  3. CDN加速服务

    CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一般的CDN公共库都会包含全球所有最流行的开源JavaScrip ...

  4. CSS3学习-用CSS制作立体导航栏

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 织梦后台上传mp4视频不显示

    include/dialog/select_media.php ,约185行, 把(rm|rmvb) 改为(rm|mp4|rmvb)

  6. 百度地图web 笔记

    1.marker点击事件获取marker的title和lebal等信息 marker.setTitle(title); marker.setLabel(label); marker.addEventL ...

  7. ios 利用runtime任性跳转

    在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来的数据规则,跳转到对应的控制器 feeds列表:不同类似的cell,可能跳转不同的控制器(嘘!产品经理是这样要求:我也不确定会跳转哪个界面哦 ...

  8. sqlserver 查询某表的所有列名

    select name + ',' from syscolumns where id = object_id('SEND_TALLY') AND name <> 'PICDATAS'

  9. jsp四大作用域之page

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  10. UVA 12405 Scarecrow (基础DP)

    题意: 给出一个1*N的矩阵(就是一行的格子),其中部分格子可以有草,部分无草,现在要求放置一些稻草人在某些格子上,每个稻草人可以覆盖3个连续格子,为使得有草的格子都能被覆盖,问最少放置几个稻草人. ...