P6810 「MCOI-02」Convex Hull 凸包(数论)

题意:

给定n,m,p,要求计算:
a n s = ∑ i = 1 n ∑ j = 1 m d ( i ) d ( j ) d ( g c d ( i , j ) ) ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)d(gcd(i,j)) ans=i=1nj=1md(i)d(j)d(gcd(i,j))
答案对p取模。
其中d(x)=x的约数个数。

数据范围:n,m<=2e6,p<=1e9

解法:

a n s = ∑ i = 1 n ∑ j = 1 m d ( i ) d ( j ) d ( g c d ( i , j ) ) 因 为 d ( g c d ( i , j ) ) = ∑ k ∣ i , k ∣ j 1 , 所 以 : a n s = ∑ i = 1 n ∑ j = 1 m d ( i ) d ( j ) ∑ k ∣ i , k ∣ j 1 考 虑 枚 举 k : a n s = ∑ k = 1 m i n ( n , m ) ∑ k ∣ i , i < = n ∑ k ∣ j , j < = m d ( i ) d ( j ) a n s = ∑ k = 1 m i n ( n , m ) ∑ k ∣ i , i < = n d ( i ) ∑ k ∣ j , j < = m d ( j ) O ( n ∗ l o g n ) 预 处 理 一 下 : f [ k ] = ∑ k ∣ i , i < = n d ( i ) g [ k ] = ∑ k ∣ j , j < = m d ( j ) ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)d(gcd(i,j))\\ 因为d(gcd(i,j))=\sum_{k|i,k|j}1,所以:\\ ans=\sum_{i=1}^n\sum_{j=1}^md(i)d(j)\sum_{k|i,k|j}1\\ 考虑枚举k:\\ ans=\sum_{k=1}^{min(n,m)}\sum_{k|i,i<=n}\sum_{k|j,j<=m}d(i)d(j)\\ ans=\sum_{k=1}^{min(n,m)}\sum_{k|i,i<=n}d(i)\sum_{k|j,j<=m}d(j)\\ O(n*logn)预处理一下:\\ f[k]=\sum_{k|i,i<=n}d(i)\\ g[k]=\sum_{k|j,j<=m}d(j)\\ ans=i=1nj=1md(i)d(j)d(gcd(i,j))d(gcd(i,j))=ki,kj1,:ans=i=1nj=1md(i)d(j)ki,kj1k:ans=k=1min(n,m)ki,i<=nkj,j<=md(i)d(j)ans=k=1min(n,m)ki,i<=nd(i)kj,j<=md(j)O(nlogn):f[k]=ki,i<=nd(i)g[k]=kj,j<=md(j)

code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
int d[maxm];
int f[maxm];
int g[maxm];
int n,m,mod;
signed main(){
    scanf("%d%d%d",&n,&m,&mod);
    for(int i=1;i<maxm;i++){
        for(int j=i;j<maxm;j+=i){
            d[j]=(d[j]+1)%mod;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=i;j<=n;j+=i){
            f[i]=(f[i]+d[j])%mod;
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=i;j<=m;j+=i){
            g[i]=(g[i]+d[j])%mod;
        }
    }
    int ans=0;
    for(int k=1;k<=min(n,m);k++){
        ans=(ans+1ll*f[k]*g[k]%mod)%mod;
    }
    printf("%d\n",ans);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值