Codeforces 615D Multipliers (数论)
题目链接 Multipliers
题意很明确。
很显然答案可以表示成X ^ EXP % MOD
首先我们令N为输入的n个数的乘积。并且设N = (P1 ^ C1) * (P2 ^ C2) * ... * (Pk * Ck),Pi(1 <= i <= k)为质数。
1、N为完全平方数。
这个时候X = N的算术平方根,EXP = (C1 +1) * (C2 + 1) * ... * (Ck + 1), MOD = 1e9 + 7;
2、N不是完全平方数。
这个时候X = N, EXP = (C1 +1) * (C2 + 1) * ... * (Ck + 1) / 2, MOD = 1e9 + 7;
考虑到EXP可能非常大,这里我用了指数循环节公式:
a^b%c = a^( b%phic+phic )%c phix为欧拉函数。
而在题中c等于1e9 + 7为质数,那么phic = 1e9 + 6。
剩下的事情就很简单了。
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for(int i(a); i <= (b); ++i)
#define LL long long const int N = ;
const LL mod = ; int prime[N];
int c[N], d[N];
bool fl;
int cnt = ;
int n, x;
int squ; map <int, int> mp; inline LL Pow(LL a, LL b, LL Mod){
LL ret();
for (; b; b >>= , (a *= a) %= Mod)
if (b & ) (ret *= a) %= Mod;
return ret;
} int main(){ rep(i, , ){
fl = true;
rep(j, , (int)sqrt(i + 0.5)) if (i % j == ){
fl = false;
break;
}
if (fl){
prime[++cnt] = i;
mp[prime[cnt]] = cnt;
}
} memset(c, , sizeof c); scanf("%d", &n);
rep(i, , n){
scanf("%d", &x);
++c[mp[x]];
} squ = ;
rep(i, , cnt)
if (c[i]){
if (c[i] & ){
squ = ;
break;
}
} LL exp = ;
if (squ){
LL ret = ;
rep(i, , cnt) d[i] = c[i] / ;
rep(i, , cnt) ++c[i];
rep(i, , cnt) (exp *= c[i]) %= (mod - ); rep(i, , cnt) if (d[i]) (ret *= Pow(prime[i], d[i], mod)) %= mod; printf("%lld\n", Pow(ret, exp + mod - , mod));
} else
{
rep(i, , cnt) d[i] = c[i] + ;
rep(i, , cnt) if (d[i] % == ){
d[i] >>= ;
break;
} LL exp = ;
rep(i, , cnt) (exp *= d[i]) %= (mod - );
LL ret = ;
rep(i, , cnt) if (c[i]) (ret *= Pow(prime[i], c[i], mod)) %= mod; printf("%lld\n", Pow(ret, exp + mod - , mod));
} return ; }
Codeforces 615D Multipliers (数论)的更多相关文章
- CodeForces - 615D Multipliers(数论)
http://codeforces.com/problemset/problem/615/D 题意 给出m个质因子,组成一个数n.问n的约数的乘积是多少,输出mod 1e+7的结果. 分析 从输入我们 ...
- codeforces 615D - Multipliers
Multipliers 题意:给定一个2e5范围内的整数m,之后输入m个2e5内的素数(当然可以重复了),问把这些输入的素数全部乘起来所得的数的约数的乘积mod(1e9+7)等于多少? 思路:对题目样 ...
- Codeforces Round #338 (Div. 2) D. Multipliers 数论
D. Multipliers 题目连接: http://codeforces.com/contest/615/problem/D Description Ayrat has number n, rep ...
- codeforces 615 D. Multipliers (数论 + 小费马定理 + 素数)
题目链接: codeforces 615 D. Multipliers 题目描述: 给出n个素数,这n个素数的乘积等于s,问p的所有因子相乘等于多少? 解题思路: 需要求出每一个素数的贡献值,设定在这 ...
- 【14.67%】【codeforces 615D】Multipliers
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- codeforces 735D Taxes(数论)
Maximal GCD 题目链接:http://codeforces.com/problemset/problem/735/D ——每天在线,欢迎留言谈论. 题目大意: 给你一个n(2≤n≤2e9) ...
- CF 615D Multipliers
题目:http://codeforces.com/contest/615/problem/D 求n的约数乘积. 设d(x)为x的约数个数,x=p1^a1+p2^a2+……+pn^an,f(x)为x的约 ...
- Codeforces 1106F(数论)
要点 998244353的原根g = 3,意味着对于任意\[1 <= x,y<p\]\[x\neq\ y\]\[g^x\%p\neq\ g^y\%p\]因此可以有构造序列\(q(a)与a一 ...
- Codeforces 858A. k-rounding 数论
题目: 题意:输入n和k,找到一个最小的数,满足末尾有至少k个0和是n的倍数. 最小的情况 ans = n,最大的情况 ans = n*pow(10,k). 令 k = pow(10,k); 我们发现 ...
随机推荐
- 动态规划:HDU1003-Max Sum(最大子序列和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- Fibonacci again and again HDU - 1848
任何一个大学生对菲波那契数列(Fibonacci numbers)应该都不会陌生,它是这样定义的: F(1)=1; F(2)=2; F(n)=F(n-1)+F(n-2)(n>=3); 所以,1, ...
- Git-起步
Git命令行 只要输入git,Git就会不带任何参数地列出它的选项和最常用的子命令. 要得到一个完整的git子命令列表,可以输入git help --all 显示版本号 git --version 每 ...
- dotnet core 2.2 安装后在vs2017中无法选择 dotnet core 2.2 为目标框架
可能有效的解决方案: 无法完全保证有效,因为我本地装上没问题,只帮同事解决过一次,貌似有效 方案就是多装几个 .net core 2.2.xxx 版本,然后可能就正常识别了. 在安装之前,先把 vs ...
- 【Luogu P1661】扩散
题目: 一个点每过一个单位时间就会向四个方向扩散一个距离,如图. 两个点$a$.$b$连通,记作$e(a,b)$,当且仅当$a$.$b$的扩散区域有公共部分.连通块的定义是块内的任意两个点$u$.$v ...
- dijkstra 堆优化
#include <iostream> #include <vector> #include <cstring> #include <queue> us ...
- [oldboy-django][2深入django]浏览器同源策略 + JSONP + cros
浏览器的同源策略: - 同源: 同方法,同域名,同端口 http://www.baidu.com:8000 http: 方法 www.baidu.com: 域名 8000: 端口 - 定义 网上解析非 ...
- java中使用二进制进行权限控制
基本概念 package test; publicclass Rights { publicstaticvoid main(String[] args) { int a=1; // 001 状态a i ...
- C#HTTP POST文件数据
/// <summary> /// 上传文件 /// </summary> /// <param name="uriStr">服务器网址< ...
- 【bzoj3998】[TJOI2015]弦论 后缀自动机+dp
题目描述 对于一个给定长度为N的字符串,求它的第K小子串是什么. 输入 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个.T=1则表示不同位置 ...