Product

 Accepts: 21
 Submissions: 171
 Time Limit: 6000/3000 MS (Java/Others)
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
给n个数{A}_{1},{A}_{2}....{A}_{n}A​1​​,A​2​​....A​n​​,表示N=\prod_{i=1}^{n}{i}^{{A}_{i}}N=∏​i=1​n​​i​A​i​​​​。求N所有约数之积。
输入描述
输入有多组数据.
每组数据第一行包含一个整数n.(1\leq n\leq {10}^{5})(1≤n≤10​5​​)
第二行n个整数{A}_{1},{A}_{2}....{A}_{n}A​1​​,A​2​​....A​n​​,保证不全为0.(0\leq {A}_{i}\leq {10}^{5})(0≤A​i​​≤10​5​​).
数据保证 \sum n\leq 500000∑n≤500000.
输出描述
对于每组数据输出一行为答案对{10}^{9}+710​9​​+7取模的值.
输入样例
4
0 1 1 0
5
1 2 3 4 5
输出样例
36
473272463

官方题解:

做了一道div1的第三题,很好的一道题

参考了别人的代码,其中一处是(p^index)%mod,如果index很大的话,根据欧拉定理,就可以变成(p^(index%(phi(mod))))%mod。记录一下。

代码:

#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
using namespace std; typedef long long ll; ll N;
const int maxn = 100010;
const ll mod = 1e9 + 7;
const ll mod2 = 2 * (mod - 1);
ll index[maxn], L[maxn], R[maxn];
int num, pri[maxn], vis[maxn];
vector<int>have[maxn]; void init()
{
num = 0;
int i, j, n;
for (i = 2; i < maxn; i++)
{
if (vis[i])
continue;
pri[++num] = i;
for (j = i + i; j < maxn; j = j + i)
{
vis[j] = 1;
}
}
for (i = 1; i < maxn; i++)
{
n = i;
for (j = 1; j <= num&&pri[j] <= n; j++)
{
while (n%pri[j] == 0)
{
have[i].push_back(j);//记录所含有的质数,用质数的下标记录
n /= pri[j];
}
}
}
} ll getresult(ll A, ll n, ll k)
{
ll b = 1;
while (n > 0)
{
if (n & 1)
{
b = (b*A) % k;
}
n = n >> 1;
A = (A*A) % k;
}
return b;
} void solve(int cishu, int n)
{
int temp;
int si = have[cishu].size();
for (int i = 0; i < si; i++)
{
temp = have[cishu][i];
index[temp] = (index[temp] + n) % mod2;
}
} int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout); int x;
ll k, n, ans;
init();
while (scanf("%d", &N) == 1)
{
memset(index, 0, sizeof(index));
for (int i = 1; i <= N; i++)
{
scanf("%d", &x);
solve(i, x);
}
int p = 1;
while (pri[p] < N)
p++;
N = p;
L[0] = R[N + 1] = 1;
for (int i = 1; i <= N; i++)
L[i] = L[i - 1] * (index[i] + 1) % mod2;
for (int i = N; i >= 1; i--)
R[i] = R[i + 1] * (index[i] + 1) % mod2;
ans = 1;
for (int i = 1; i <= N; i++)
{
k = L[i - 1] * R[i + 1] % mod2;
n = index[i] * (index[i] + 1) / 2 % mod2;
ans = ans*getresult(pri[i], n*k%mod2,mod) % mod;
}
printf("%lld\n", ans);
}
//system("pause");
return 0;
}

最新文章

  1. openStack windows时间偏移
  2. AC自动机——Uva 11468 子串
  3. projecteuler 10001st prime (求出第10001个质数)
  4. Karaf 依赖equinox and felix,karaf 本Apache的很多项目作为基础框架
  5. URAL 1183 Brackets Sequence(DP)
  6. 422. Valid Word Square
  7. dbda封装类(包括:返回二维数组、Ajax调用返回字符串、Ajax调用返回JSON)
  8. 在windows server里,对于同一个账号,禁止或允许多个用户使用该账户,同时登录
  9. CCF-201604-1-折点计数
  10. xpath 在firefox,chrome中正常,在requests中不正常的解决。
  11. 第九次作业——K-means算法应用:图片压缩
  12. OO第一单元小结
  13. 安装sqlprompt
  14. react native的注释
  15. 斯坦纳树 [bzoj2595][wc2008]游览计划 题解
  16. [运维-安全]CentOS7.0环境下安装kangle和easypanel
  17. 深度强化学习:入门(Deep Reinforcement Learning: Scratching the surface)
  18. .NET(C#):使用反射来获取枚举的名称、值和特性
  19. Jenkins多选项框使用
  20. ExtJs之列表(grid)

热门文章

  1. 04-Docker-Container管理操作
  2. 浅谈CVE-2018-12613文件包含/buuojHCTF2018签到题Writeup
  3. SpringBoot简要介绍
  4. 爬虫(十四):Scrapy框架(一) 初识Scrapy、第一个案例
  5. TortoiseGit 安装与配置
  6. TCP通讯代码
  7. python中模块的制作
  8. 解决idea创建maven项目无java
  9. Python回收机制
  10. 「快学springboot」SpringBoot多环境配置文件