CF615D Multipliers [数学]

tags:[计数原理][乘法逆元][归纳の思想]
题解(复杂度:O(mlogm)):
棘手之处:n的约数多到爆炸。因此我们不妨从因子的角度来分析问题。
对n分解质因数得:n = p1^a1 * p2^a2 * ... * pk^ak。
令 M = (a1+1)*(a2+1)*...*(ak+1)。
p1在答案中被乘的次数为:(a2+1)*(a3+1)*...*(ak+1)*(1+2+...+a1) = M*a1/2
p1给最终答案作出的贡献为:p1^(M*a1/2)。同理可得其它因子给答案的贡献。
将每一个因子做出的贡献乘起来即为最终答案。
tips: 除以2的时候要用乘法逆元

code:

 1 #include <iostream>
 2 using namespace std;
 3 typedef long long LL;
 4 const int NICO = 200000 + 10;
 5 const LL MOD = 1000000000 + 7;
 6 int m, cnt[NICO];
 7
 8 LL mod_pow(LL p, LL k, LL mod)
 9 {
10     LL res = 1;
11     while(k > 0)
12     {
13         if(k % 2 == 1) res = res * p % mod;
14         p = p * p % mod;
15         k /= 2;
16     }
17     return res % mod;
18 }
19
20 int main()
21 {
22     cin >> m;
23     for(int i=1;i<=m;i++)
24     {
25         int k; cin >> k;
26         cnt[k] ++;
27     }
28     LL M = 1, ans = 1;
29     for(int i=1;i<NICO;i++)
30     {
31         M = M * (cnt[i] + 1) % (2*MOD-2);
32     }
33     for(int i=1;i<NICO;i++)
34     {
35         LL tmp = M * cnt[i] % (2*MOD-2) / 2;
36         ans = ans * mod_pow(i, tmp, MOD) % MOD;
37     }
38     cout << ans << endl;
39 }
时间: 2024-08-08 01:45:07

CF615D Multipliers [数学]的相关文章

[HNOI2011]数学作业

题目描述 小 C 数学成绩优异,于是老师给小 C 留了一道非常难的数学作业题: 给定正整数 N 和 M,要求计算 Concatenate (1 .. N) Mod M 的值,其中 Concatenate (1 ..N)是将所有正整数 1, 2, -, N 顺序连接起来得到的数.例如,N = 13, Concatenate (1 .. N)=12345678910111213.小C 想了大半天终于意识到这是一道不可能手算出来的题目,于是他只好向你求助,希望你能编写一个程序帮他解决这个问题. 输入输

codeforces_346A Alice and Bob(数学)

题目链接:http://codeforces.com/problemset/problem/346/A 参考链接:http://blog.csdn.net/loy_184548/article/details/50174615 感受到数学在博弈论中的强大. 考虑最后终止状态的序列-无法取出任意两个数他们的差值不存在这个序列中:那么这必定是个首项等于公差的等差序列 而这个序列是 d 2d 3d....,因此可以通过a[1] a[2] a[3] ...的最大公约数得到 然后计算有几个数没在数组中,判

UVA 10089 Repackaging 数学问题

大致题意:给出几个包裹,每个包裹都包装好了3种大小的杯子.现在要重新包装,使向量 a[1]*(s[1][1],s[1][2],s[1][3])+a[2]*(s[2][1],s[2][2],s[2][3])+.....+a[n]*(s[n][1],s[n][2],s[n][3])=(k,k,k). 就这样转化成了向量问题其中a[i]为非负整数,k为正整数. 虽然转化成了向量问题,但是三维向量和这么多变量有点棘手,所以我们可以先降维,将原等式变化成: a[1]*(s[1][2]-s[1][1],s[

图像处理中的数学原理详解17——卷积定理及其证明

欢迎关注我的博客专栏"图像处理中的数学原理详解" 全文目录请见 图像处理中的数学原理详解(总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 图像处理中的数学原理详解(已发布的部分链接整理) http://blog.csdn.net/baimafujinji/article/details/48751037 1.4.5   卷积定理及其证明 卷积定理是傅立叶变换满足的一个重要性质.卷积定理指出,函数卷积的傅立叶变

如何入门参加数学建模竞赛

1 网上资源 1.1 数学中国 可以去数学中国网站看看,在数学建模比赛的培训这一块做得很好的机构,如果自己有点银子,可以去参加他们的网上课程.另外他们有专门的数学建模群,群里面有很好关于数学建模的资料.而且这个机构自己也举办数学建模比赛,如果有时候可以在这里组队,直接参加比赛,累积一些经验,增长见识. 1.2 数学建模视频课程,现在网络上有一些比较好的关于数学建模比赛的视频资源,可以谷歌一下 1.3 网络上的一些关于数学建模的电子书,有时候你也不知道哪本书比较适合你,所以你可以先在网上找一些电子

第三周项目4-考了语文数学的学生

下面提供了类Stu的数据成员定义,和用于测试的main函数,参考如图的运行结果,完成类的定义. /* * Copyright (c) 2015,烟台大学计算机学院 * All right reserved. * 作者:邵帅 * 文件:Demo.cpp * 完成时间:2015年03月21日 * 版本号:v1.0 */ #include<iostream> #include<string> using namespace std; class Stu { private: string

51nod 1138 连续整数的和(数学)

题目描述: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1138 给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2).例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8.如果不能写为若干个连续整数的和,则输出No Solution. Input 输入1个数N(3 <= N <= 10^9). OutPut 输出连续整数中的第1个数,如果有多

[笔记]shell编程:数学计算

在shell Script中,有好几种进行数学运算的方法,虽然有几个效果差不多,在编写程序的时候使用一种方法就够了,但是我们可能还需要学习别人的程序啊,在阅读别人的程序的时候不能不认识这些东西吧.所以,留个笔记. 一.expr 命令  --  expr 允许在命令行上处理数学表达式,但是略显拙劣. 例:$ expr 1 + 5    #注意在表达式中要有空格,如果写成1+5那么结果就不是我们想要的了. expr命令能够识别一些不同的数学和字符串操作符: 操作符 描述 arg1 | arg2 如果

hdoj 3750 Guess Game 【数学之二分】

题意:用二分法找出数学期望. 策略,二分. 求数学期望有两种方法,一:求出每一个数的概率,再与数相乘,最后把所有的乘积相加就好了. 二:数学期望总是与平均数相等,所以可以当做求平均数.(简单方便) 代码: #include <stdio.h> #include <string.h> int sum; void bi_sear(int n){ sum = 0; int temp, i, left, right, mid; for(i = 1; i <= n; i ++){ te