DZY Loves Math VI

Description

给定正整数n,m。求

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)^{gcd(i,j)}\]

Input

一行两个整数n,m。

Output

一个整数,为答案模1000000007后的值。

Sample Input

5 4

Sample Output

424

HINT

数据规模:

1<=n,m<=500000,共有3组数据。

首先推柿子

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)^{gcd(i,j)}\]

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^m(\dfrac{i\times j}{gcd(i,j)})^{gcd(i,j)}\]

\[\sum\limits_{d=1}^n\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}(\dfrac{d^2\times i\times j}{d})^d[gcd(i,j)==1]\]

\[\sum\limits_{d=1}^nd^d\sum\limits_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor\frac{m}{d}\rfloor}i^d\times j^d\sum\limits_{x|i,x|j}\mu(x)\]

\[\sum\limits_{d=1}^nd^d\sum\limits_{x=1}^{\lfloor\frac{n}{d}\rfloor}\mu(x)\times x^{2d}\sum\limits_{i=1}^{\lfloor\frac{n}{dx}\rfloor}i^d\sum\limits_{j=1}^{\lfloor\frac{m}{dx}\rfloor}j^d\]

然后设\(T=dx\),然后就。。。布星,推不下去了

发现m<=5e5,那不就得了,直接这样求就好,枚举d的时候,维护一下\(f(n)=\sum\limits_{i=1}^n i^d\)即可,复杂度约为\(O(m\log m)\)

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for (;ch<‘0‘||ch>‘9‘;ch=getchar())  if (ch==‘-‘)    f=-1;
    for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar())    x=(x<<1)+(x<<3)+ch-‘0‘;
    return x*f;
}
inline void print(int x){
    if (x>=10)  print(x/10);
    putchar(x%10+‘0‘);
}
const int N=5e5,p=1e9+7;
int prime[N+10],miu[N+10];
bool inprime[N+10];
void prepare(){
    int tot=0; miu[1]=1;
    for (int i=2;i<=N;i++){
        if (!inprime[i])    prime[++tot]=i,miu[i]=-1;
        for (int j=1;j<=tot&&prime[j]*i<=N;j++){
            inprime[i*prime[j]]=1;
            if (i%prime[j]==0)  break;
            miu[i*prime[j]]=-miu[i];
        }
    }
}
int mlt(int a,int b){
    int res=1;
    for (;b;b>>=1,a=1ll*a*a%p)  if (b&1)    res=1ll*res*a%p;
    return res;
}
int val[N+10],sum[N+10];
int main(){
    prepare();
    int n=read(),m=read(),Ans=0;
    if (n>m)    swap(n,m);
    for (int i=1;i<=m;i++)  val[i]=1;
    for (int d=1;d<=n;d++){
        int x=mlt(d,d),res=0,limn=n/d,limm=m/d;
        for (int i=1;i<=limm;i++)   val[i]=1ll*val[i]*i%p,sum[i]=(sum[i-1]+val[i])%p;
        for (int i=1;i<=limn;i++){
            if (!miu[i])    continue;
            res=(res+1ll*val[i]*val[i]%p*sum[limn/i]%p*sum[limm/i]%p*miu[i]+p)%p;
        }
        Ans=(Ans+1ll*x*res%p)%p;
    }
    printf("%d\n",Ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Wolfycz/p/9493616.html

时间: 2024-10-14 08:24:42

DZY Loves Math VI的相关文章

bzoj3561DZY Loves Math VI

3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 503  Solved: 333[Submit][Status][Discuss] Description 给定正整数n,m.求 Input 一行两个整数n,m. Output 一个整数,为答案模1000000007后的值. Sample Input 5 4 Sample Output 424 HINT 数据规模: 1<=n,m<=500000,共有3

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample In

[BZOJ3568]DZY Loves Math VII

本人BZOJ的处女作. 这题题面还是蛮有趣的吧. 然后三个问题都蛮有意思的. 要保证正确性,出数据还是异常蛋疼啊. 本来各出三题的.但是考虑到是OJ上的题,就搞在一起了.这样代码量就会比较大. [BZOJ3568]DZY Loves Math VII,布布扣,bubuko.com

【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 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) 不难发现

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

Bzoj3481 DZY Loves Math III

Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 310  Solved: 65 Description Input Output Sample Input 3 1 2 3 2 4 2 Sample Output 6 HINT 1<=N<=10,0<=Qi<=10^18,1<=Pi<=10^18,P>=2 本题仅四组数据. Source By Jc 数学问题 欧拉函数 Miller-Rabin Pollard-rho 花了

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完,实际上两个小时都被这道题

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