CodeForces - 615D Multipliers(数论)
http://codeforces.com/problemset/problem/615/D
题意
给出m个质因子,组成一个数n。问n的约数的乘积是多少,输出mod 1e+7的结果。
分析
从输入我们能知道这个数的所有质因子以及它们的个数。最后答案一定是ans=π p[i]^k[i] (p[i]为质因子,k[i]为最终乘积中的个数)。
那么主要问题就是怎么求这个k[i]了。现在我们只关注一个质因子p,它的个数为num,那么其它质因子都有num[i]+1种可选择,根据乘法原理,当我们选定p时,其它质因子的选法总数为d=π (num[i]+1)。而此时p可以选1~num[i],根据加法原理,此时方案数为k=num*(num+1)/2*d。
将这种思想分散到每一个质因子,最终答案就是ans=π p[i]^(num[i]*(num[i]+1)/2*d[i])。故事到这里好像就要结束了,但在实际编写是,由于k[i]过大会出错。所以还需要想想办法。
这时费马小定理出场啦:a^n=a^(n%(m-1)) mod m。因此我们对指数进行mod (m-1)的行动,但由于指数需要除以2而1e9+7-1不和2互质了,因此这里不能用逆元处理分数取模了。
又一个定理出现:(a/b)%m=(ab)%m/2。至此问题完美解决了。另外,指数部分:num[i]*(num[i]+1)/2*d[i]且d[i]=π (num[j]+1) (i != j)。所以可以偷偷懒,直接把所有的num[i]+1乘起来。详情看代码
#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<map>
#include<set>
#define rep(i,e) for(int i=0;i<(e);i++)
#define rep1(i,e) for(int i=1;i<=(e);i++)
#define repx(i,x,e) for(int i=(x);i<=(e);i++)
#define X first
#define Y second
#define PB push_back
#define MP make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define pd(a) printf("%d\n",a)
#define scl(a) scanf("%lld",&a)
#define scll(a,b) scanf("%lld%lld",&a,&b)
#define sclll(a,b,c) scanf("%lld%lld%lld",&a,&b,&c)
#define IOS ios::sync_with_stdio(false);cin.tie(0)
using namespace std;
typedef long long ll;
template <class T>
void test(T a){cout<<a<<endl;}
template <class T,class T2>
void test(T a,T2 b){cout<<a<<" "<<b<<endl;}
template <class T,class T2,class T3>
void test(T a,T2 b,T3 c){cout<<a<<" "<<b<<" "<<c<<endl;}
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const ll mod = 1e9+;
int T;
void testcase(){
printf("Case %d: ",++T);
}
const int MAXN = 2e5+;
const int MAXM = ; ll a[MAXN],p[MAXN],num[MAXN]; ll qpow(ll a,ll b){
ll res=;
while(b){
if(b&) res=(res*a)%mod;
a=(a*a)%mod;
b>>=;
}
return res;
} int main() {
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int n,cnt=;
scd(n);
for(int i=;i<=n;i++) scl(a[i]);
sort(a+,a+n+);
for(int i=;i<=n;i++){
if(i==||a[i]!=a[i-]){
p[++cnt]=a[i];
num[cnt]=;
}else{
num[cnt]++;
}
} ll tmp=,ans=;
for(int i=;i<=cnt;i++){
tmp=(tmp*(num[i]+))%(*mod-);
} for(int i=;i<=cnt;i++){
ans=ans*qpow(p[i],num[i]*tmp/%(*mod-))%mod;
}
cout<<ans<<endl;
return ;
}
CodeForces - 615D Multipliers(数论)的更多相关文章
- Codeforces 615D Multipliers (数论)
题目链接 Multipliers 题意很明确. 很显然答案可以表示成X ^ EXP % MOD 首先我们令N为输入的n个数的乘积.并且设N = (P1 ^ C1) * (P2 ^ C2) * ... ...
- 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); 我们发现 ...
随机推荐
- PAT L2-015 互评成绩
https://pintia.cn/problem-sets/994805046380707840/problems/994805062432309248 学生互评作业的简单规则是这样定的:每个人的作 ...
- PAT 1013 数素数
https://pintia.cn/problem-sets/994805260223102976/problems/994805309963354112 令P~i~表示第i个素数.现任给两个正整数M ...
- Spring及Spring Boot 国内快速开发框架
http://www.javacoder.top/home.jsp# http://springboot.fun/ 一个常用的支付子项目 https://gitee.com/52itstyle/spr ...
- JDK学习AbstractQueuedSynchronizer和AbstractQueuedLongSynchronizer
AbstractQueuedLongSynchronizer类是扩展自AbstractQueuedSynchronizer的,实现了java.io.Serializable接口. 其中提到的wait ...
- ActiveMQ应用(1)-安装及示例
简介: Apache ActiveMQ ™ 是最流行最强大的开源消息及继承模式服务器.i Apache ActiveMQ 速度快,支持多种语言的客户端及代理,可便捷的使用企业集成模式,完整支持JMS1 ...
- LODOP弹出对话框获取保存文件的路径
通常一般不会让用户自己在文本框里填上路径,因为路径要输入字母字符等比较麻烦,而且用户硬盘里文件很多,也不知道要保存在哪里,LODOP可以弹出一个选择保存路径的弹窗,然后把返回选择的路径值.这样用户就可 ...
- Lodop导出excel及提示成功【回调和直接返回值】
高版本的火狐和谷歌不再支持np插件之后,Lodop公司推出了C-Lodop,解决了这些浏览器不能用Lodop插件方式打印的问题,相比较Lodop插件,C-Lodop由于是以服务的形式出现,返回值不能直 ...
- C/S架构引用Lodop 如何在C#调用web打印控件Lodop
lodop是web打印控件,引用安装目录下的ocx文件,可以在c/s架构中使用. 该文件所在路径:C:\Program Files (x86)\MountTaiSoftware\Lodop 有32位和 ...
- mybatis model属性注入多个对象 与model属性注入单个对象
- 2.18比赛(T2,T3留坑)
2.18比赛(T2,T3留坑) pdf版题面 pdf版题解 超越一切(ak) [题目描述] 夏洛可得到一个(h+1)×(w+1)的巧克力,这意味着她横着最多可 以切 h 刀,竖着最多可以切 w 刀 她 ...