【bzoj3560】DZY Loves Math V 欧拉函数

题目描述

给定n个正整数a1,a2,…,an,求

的值(答案模10^9+7)。

输入

第一行一个正整数n。

接下来n行,每行一个正整数,分别为a1,a2,…,an。

输出

仅一行答案。

样例输入

3
6
10
15

样例输出

1595



题解

欧拉函数

由于 $\varphi$ 是积性函数,所以可以单独考虑每个质因子的贡献。

那么对于最终的 $a=i_1i_2\dots i_n$ ,若其包含 $p^c\ ,\ c>0$ ,则贡献为 $\frac{p-1}{p}·p^c$ 。因此求出 $p^c$ 的总和,再乘上 $\frac{p-1}{p}$ ,再加上1(都不包含 $p$ 的情况)即可得到 $p$ 的总贡献。

设 $a_j$ 中包含 $p^{c_j}$ ,那么 $p^c$ 的总和就是所有与 $p$ 相关的 $\prod\limits_{j=1}^n\sum\limits_{k=0}^{c_j}p^k$ 减去不含 $p$ 的 $1$ 。

因此最终答案就是 $\prod\limits_{prime(p)}(\frac{p-1}{p}(\prod\limits_{j=1}^n\sum\limits_{k=0}^{c_{p,j}}p^k-1)+1)$ 。

线性筛预处理每个数最小的质因子,对每个数 $O(\log a)$ 分解质因数,复杂度 $O(a+n\log a)$

#include <cstdio>
#define M 10000010
#define mod 1000000007
typedef long long ll;
int pre[M] , prime[M] , tot , val[50] , cnt[50] , top;
ll res[M];
bool np[M];
ll pow(ll x , int y)
{
    ll ans = 1;
    while(y)
    {
        if(y & 1) ans = ans * x % mod;
        x = x * x % mod , y >>= 1;
    }
    return ans;
}
void init()
{
    int n = 10000000 , i , j;
    for(i = 1 ; i <= n ; i ++ ) res[i] = 1;
    for(i = 2 ; i <= n ; i ++ )
    {
        if(!np[i]) pre[i] = prime[++tot] = i;
        for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
        {
            np[i * prime[j]] = 1 , pre[i * prime[j]] = prime[j];
            if(i % prime[j] == 0) break;
        }
    }
}
int main()
{
    init();
    int n , i , x , now , sum;
    ll ans = 1;
    scanf("%d" , &n);
    while(n -- )
    {
        scanf("%d" , &x);
        top = 0;
        for(i = x ; i != 1 ; i /= pre[i])
        {
            if(pre[i] != val[top]) val[++top] = pre[i];
            cnt[top] ++ ;
        }
        for(i = 1 ; i <= top ; i ++ )
        {
            now = sum = 1;
            while(cnt[i]) cnt[i] -- , now *= val[i] , sum += now;
            res[val[i]] = res[val[i]] * sum % mod;
        }
    }
    for(i = 2 ; i <= 10000000 ; i ++ )
        if(!np[i] && res[i] != 1)
            ans = ans * ((res[i] - 1 + mod) * pow(i , mod - 2) % mod * (i - 1) % mod + 1) % mod;
    printf("%lld\n" , ans);
    return 0;
}

原文地址:https://www.cnblogs.com/GXZlegend/p/8461646.html

时间: 2024-10-13 18:51:41

【bzoj3560】DZY Loves Math V 欧拉函数的相关文章

BZOJ3560 DZY Loves Math V 数论 快速幂

原文链接http://www.cnblogs.com/zhouzhendong/p/8111725.html 题目传送门 - BZOJ3560 题意概括 给定n个正整数a1,a2,-,an,求 的值(答案模10^9+7). 1<=n<=10^5,1<=ai<=10^7. 题解 本人是蒟蒻. 可以看这位大佬的(给出链接) http://blog.csdn.net/popoqqq/article/details/42739963 代码 呵呵,调试的时候照着他的改,改的几乎一样-- #i

BZOJ3560: DZY Loves Math V

虽然不是很神的题,不过拿短代码搞到rank1了那么纪念下. 先观察样例. 6=2*3; 10=2*5; 15=3*5; 对应答案:1595=5*11*29: 其中: 5=((1+2)*(1+2)*1*(2-1)+1)/2 11=((1+3)*1*(1+3)*(3-1)+1)/3 29=(1*(1+5)*(1+5)*(5-1)+1)/5 证明不写了……自行领会精神. 就是对每个n因数分解后对每个p分开搞搞. [代码](话说好不容易才发现插入代码这功能) 1 #include<cstdio> 2

【BZOJ 3560】 3560: DZY Loves Math V (欧拉函数)

3560: DZY Loves Math V Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 241  Solved: 133 Description 给定n个正整数a1,a2,-,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,-,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 HINT 1<=n<=1

bzoj 3560 DZY Loves Math V - 线性筛 - 数论 - 扩展欧几里得算法

给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 Hint 1<=n<=10^5,1<=ai<=10^7.共3组数据. 题目大意 (题目过于简洁,完全不需要大意) 题目虽然很简洁,但是处处挖着坑等你跳. 原计划两个小时把今天讲的例题A完,实际上两个小时都被这道题

BZOJ 3560 DZY Loves Math V 数论

题目大意:给定a1,a2,...,an,求 由于φ是积性函数,我们可以将i1i2...in分解质因数,对于每个质因数分开讨论,求积即可 将每个a分解质因数,假设分解后某个质数p在每个ai中的次数分别是bi,那么p对答案的贡献就是 于是对p^j维护一个前缀和,直接计算即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD 10000

bzoj 4026 dC Loves Number Theory (主席树+数论+欧拉函数)

题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值 还复习了欧拉函数以及线性筛逆元 考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[j]是区间内所有出现过的质数) 那么考虑找出区间内所有出现过的质数,这思路和HH的项链是不是很像?? 由于此题强制在线,所以把树状数组替换成了主席树而已 原来我以前写的主席树一直都是错的......还好推出了我原来错误代码的反例 在继承上一个树的信息时,注意不要破坏现在的树 1 #include <cs

HDU 4002 Find the maximum(数论-欧拉函数)

Find the maximum Problem Description Euler's Totient function, φ (n) [sometimes called the phi function], is used to determine the number of numbers less than n which are relatively prime to n . For example, as 1, 2, 4, 5, 7, and 8, are all less than

bzoj 3309 DZY Loves Math

LINK:DZY Loves Math 一道比较有意思的数论题 原谅我的智障多调了40min. 可以简单的推式子推出 答案为\(\sum{w=1}^n\frac{n}{w}\frac{m}{w}\sum{x|w}\mu(x)f(\frac{w}{x})\) f函数定义和题目中一致. 考虑后面前缀和怎么求 发现光求f(x)复杂度都比较高.如果我们把f(x)求出再调和级数预处理 那得GG 1e7过不了log+根号 考虑考虑一下\(\mu\)和f的这种形式肯定值有局限 设后面的东西为g(x) 不难发现

欧拉函数之和(51nod 1239)

对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等.例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质. S(n) = Phi(1) + Phi(2) + ...... Phi(n),给出n,求S(n),例如:n = 5,S(n) = 1 + 1 + 2 + 2 + 4 = 10,定义Phi(1) = 1.由于结果很大,输出Mod 1000000007的结