【BZOJ3960】DZY Loves Math V(数论)
题目:
分析:
orz跳瓜。
欧拉函数的公式:
\]
其中 \(p_i\) 取遍 \(n\) 的所有质因子。
考虑原式,把欧拉函数展开,得到:
\sum_{b_1|a_1}\sum_{b_2|a_2}\cdots\sum_{b_n|a_n}\prod p_j^{a_j}\frac{(p_j-1)}{p_j}\]
其中 \(p_j\) 取遍 \(\prod b_i\) 的所有质因子, \(\prod p_j^{a_j}=\prod b_i\)。
可以看出,对于每个质数 \(p\) ,它的贡献是独立的。设 \(a_j\) 中 \(p_i\) 的次数为 \(c_{ij}\) ,则答案为:
\]
其中 \(k_j\) 表示在第 \(j\) 个数中取了 \(p_i\) 的 \(k_j\) 次幂。当 \(\sum k_j=0\) (即 \(\prod b_i\) 不含质因子 \(p_i\) )时不乘 \(\frac{p_i-1}{p_i}\) ,这种情况中 \(p_i\) 对答案的贡献是乘 \(1\) (即最前面加的 \(1\) )。
上面的式子相当于(括号比较鬼畜,凑合看吧……):
\]
(即直接减去不合法的 \(p_i^{\sum k_j}=p_i^0=1\) )
然后可以暴力算。对于每一个质数预处理出它的幂的前缀和,并可以只枚举有质因子 \(p_i\) 的 \(a_j\) 。由于每个数的质因子种类数最多 \(10\) 个左右,所以总复杂度大约 \(O(10n)\),可以过。具体实现详见代码。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
namespace zyt
{
    template<typename T>
    inline bool read(T &x)
    {
        char c;
        bool f = false;
        x = 0;
        do
            c = getchar();
        while (c != EOF && c != '-' && !isdigit(c));
        if (c == EOF)
            return false;
        if (c == '-')
            f = true, c = getchar();
        do
            x = x * 10 + c - '0', c = getchar();
        while (isdigit(c));
        if (f)
            x = -x;
        return true;
    }
    template<typename T>
    inline void write(T x)
    {
        static char buf[20];
        char *pos = buf;
        do
            *pos++ = x % 10 + '0';
        while (x /= 10);
        while (pos > buf)
            putchar(*--pos);
    }
    typedef long long ll;
    const int N = 1e5 + 10, MX = 1e6 + 10, B = 30, mod = 1e9 + 7;
    int n, cnt, pow[B];
    pair<int, int> prime[MX];
    void get_prime(int a)
    {
        for (int i = 2; (ll)i * i <= a; i++)
            if (a % i == 0)
            {
                prime[cnt++] = make_pair(i, 0);
                while (a % i == 0)
                    ++prime[cnt - 1].second, a /= i;
            }
        if (a > 1)
            prime[cnt++] = make_pair(a, 1);
    }
    inline int power(int a, int b)
    {
        int ans = 1;
        while (b)
        {
            if (b & 1)
                ans = (ll)ans * a % mod;
            a = (ll)a * a % mod;
            b >>= 1;
        }
        return ans;
    }
    inline int inv(const int a)
    {
        return power(a, mod - 2);
    }
    int cal(const int l, const int r)
    {
        int p = prime[l].first;
        int ans = 1, mx = 0;
        for (int i = l; i <= r; i++)
            mx = max(mx, prime[i].second);
        pow[0] = 1;
        for (int i = 1; i <= mx; i++)
            pow[i] = (ll)pow[i - 1] * p % mod;
        for (int i = 1; i <= mx; i++)
            pow[i] = (pow[i] + pow[i - 1]) % mod;
        for (int i = l; i <= r; i++)
            ans = (ll)ans * pow[prime[i].second] % mod;
        ans = (ans - 1 + mod) % mod;
        ans = (ll)ans * (p - 1) % mod * inv(p) % mod;
        return (ans + 1) % mod;
    }
    int work()
    {
        int n;
        read(n);
        for (int i = 0; i < n; i++)
        {
            int a;
            read(a);
            get_prime(a);
        }
        sort(prime, prime + cnt);
        int pre = 0, ans = 1;
        for (int i = 0; i < cnt; i++)
            if (prime[i].first != prime[i + 1].first)
                ans = (ll)ans * cal(pre, i) % mod, pre = i + 1;
        write(ans);
        return 0;
    }
}
int main()
{
    return zyt::work();
}
【BZOJ3960】DZY Loves Math V(数论)的更多相关文章
- BZOJ3560 DZY Loves Math V 数论 快速幂
		原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html UPD(2018-03-26):蒟蒻回来重新学数论了.更新了题解和代码.之前的怼到后面去了 ... 
- 【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)
		3560: DZY Loves Math V Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 241 Solved: 133 Description ... 
- BZOJ3561 DZY Loves Math VI 数论 快速幂 莫比乌斯反演
		原文链接http://www.cnblogs.com/zhouzhendong/p/8116330.html UPD(2018-03-26):回来重新学数论啦.之前的博客版面放在更新之后的后面. 题目 ... 
- BZOJ3560 : DZY Loves Math V
		因为欧拉函数是非完全积性函数,所以可以考虑对每个数进行分解质因数,将每个质数的解乘起来即可. 对于一个质数$p$,设它在各个数中分别出现了$b_1,b_2,...b_n$次,那么由生成函数和欧拉函数的 ... 
- BZOJ3560 DZY Loves Math V(欧拉函数)
		对每个质因子分开计算再乘起来.使用类似生成函数的做法就很容易统计了. #include<iostream> #include<cstdio> #include<cmath ... 
- bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法
		给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ... 
- [BZOJ3560]DZY Loves Math V(欧拉函数)
		https://www.cnblogs.com/zwfymqz/p/9332753.html 由于欧拉函数是积性函数,可以用乘法分配律变成对每个质因子分开算最后乘起来.再由欧拉函数公式和分配律发现就是 ... 
- 【bzoj3560】DZY Loves Math V  欧拉函数
		题目描述 给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). 输入 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. 输出 仅一行答案. 样例输入 3 ... 
- bzoj DZY Loves Math V
		Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 509 Solved: 284[Submit][Status][Discuss] Descriptio ... 
随机推荐
- 访问请求参数request.getParameter()
			访问请求参数request.getParameter() 制作人:全心全意 getParameter() 例: 传递参数页: <%@ page language="java" ... 
- python文件读写及形式转化和CGI的简单应用
			一丶python文件读写学习笔记 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode) filename:包含了你要访问的文件名称的字符串值. mo ... 
- JavaSE 学习笔记之网络编程(二十三)
			端口: 物理端口: 逻辑端口:用于标识进程的逻辑地址,不同进程的标识:有效端口:0~65535,其中0~1024系统使用或保留端口. java 中ip对象:InetAddress. import ja ... 
- free web rich code eidtor
			free web rich code eidtor https://i.cnblogs.com/Preferences.aspx tiny code-editor https://apps.tiny. ... 
- noip模拟赛 寻宝之后
			题目背景 还记得NOIP2011的寻宝吗?6年之后,小明带着他的妹子小芳,再次走上了寻宝的道路. 然而这次他们寻宝回来之后,小明被困在了一个迷宫中. 题目描述 迷宫是一个n*m的字符矩阵. 小明在这个 ... 
- Uva1103 Ancient Messages
			题意:识别图中的象形文字.但是,图形可以任意的拉伸,但不能拉断. 分析:这种题如果图形没有特征是不可做类型的题,不过观察图形可以发现每个图形中的洞的数量是一定的,我们只需要数出每一个封闭图形的洞数就能 ... 
- HBase  shell的常用命令(CRUD)
			@来源是传智播客hadoop的视频教程,觉得入门不错,就copy过来了 一.启动HBase: sudo -i cd /home/cx/itcast/hbase-1.2.6/bin ./start- ... 
- B. Code For 1 分治
			time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ... 
- [codevs 2488]绿豆蛙的归宿(拓扑排序)
			题目:http://dev.codevs.cn/problem/2488/ 分析:这题有个特殊的地方,就是每个边都有可能走到,所以就是每个边的权值*每个边的概率,所以只要求概率,拓扑一下就可以了. 
- 两个栈实现队列,开始做错了 —— 剑指Offer
			开始大意了,这道题目居然做错了: https://www.nowcoder.net/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId ... 
