P3768 【简单的数学题】

P3768 【简单的数学题】

\(Ans=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ijgcd(i,j)\)

\(=\sum ^{n}_{i=1}\sum ^{n}_{j=1}ij\sum _{k|i,k|j} φ(k)\)

\(=\sum ^{n}_{k=1} φ(k) \sum _{k|i}\sum _{k|j}ij\)

\(=\sum ^{n}_{k=1}\varphi (k) k^{2} (\sum ^{n/k}_{i=1}i)^{2}\)

\(=\sum ^{n}_{k=1}\varphi (k) k^{2} \sum ^{n/k}_{i=1}i^{3}\)

\(n<=1e10\)杜教筛筛 \(\varphi (k) k^{2}\)

#include<bits/stdc++.h>
#include<tr1/unordered_map>
using namespace std;
typedef long long LL;
const int maxn=5000000+9;
inline LL Read(){
    LL x=0,f=1; char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-') f=-1; c=getchar();
    }
    while(c>='0'&&c<='9')
        x=(x<<3)+(x<<1)+c-'0',c=getchar();
    return x*f;
}
LL n,p,inv;
int phi[maxn],prime[maxn];
LL sum[maxn];
bool visit[maxn];
inline LL Pow(LL base,LL b){
    LL a=1;
    while(b){
        if(b&1)
            a=(a*base)%p;
        base=(base*base)%p;
        b>>=1;
    }
    return a;
}
inline void F_phi(int N){
    inv=Pow(6,p-2);
    phi[1]=1; int tot(0);
    for(int i=2;i<=N;++i){
        if(!visit[i]){
            phi[i]=i-1;
            prime[++tot]=i;
        }
        for(int j=1;j<=tot&&i*prime[j]<=N;++j){
            visit[i*prime[j]]=true;
            if(i%prime[j]==0){
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            else
                phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
    for(int i=1;i<=N;++i)
        sum[i]=(sum[i-1]+1ll*i*i%p*phi[i]%p)%p;
    //for(int i=1;i<=2000;++i)
    //    printf("%lld ",sum[i]);printf("\n");
}
tr1::unordered_map<LL,LL> w;
inline LL S2(LL x){
    x%=p;
    return x*(x+1)%p*(2*x+1)%p*inv%p;
}
LL S3(LL x){
    x%=p;
    return (x*(x+1)/2)%p*((x*(x+1)/2)%p)%p;
}
LL Calc(LL now){
    if(now<=5000000)
        return sum[now];
    if(w[now])
        return w[now];
    LL num=S3(now);
    for(LL l=2,r;l<=now;l=r+1){
        r=now/(now/l);
        num=(num-Calc(now/l)*(S2(r)-S2(l-1)+p)%p+p)%p;
    }
    return w[now]=num;
}
int main(){
    p=Read(),n=Read();
    F_phi(5000000);

    LL ans(0);
    for(LL l=1,r;l<=n;l=r+1){
        r=n/(n/l);
        ans=(ans+S3(n/l)*((Calc(r)-Calc(l-1)+p)%p))%p;
    }
    printf("%lld",ans);
    return 0;
}/*
998244353 2000
883968974
*/

原文地址:https://www.cnblogs.com/y2823774827y/p/10229183.html

时间: 2024-07-31 13:03:38

P3768 【简单的数学题】的相关文章

Luogu P3768 简单的数学题

非常恶心的一道数学题,推式子推到吐血. 光是\(\gcd\)求和我还是会的,但是多了个\(ij\)是什么鬼东西. \[\sum_{i=1}^n\sum_{j=1}^nij\gcd(i,j)=\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[\gcd(i,j)=d]\] 很套路的把后面的\(d\)提出来: \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[\gcd(i,j)=d]=\sum_{d=1}^nd^3\sum_{i=1}^{

P3768 简单的数学题(莫比乌斯反演)

[题目链接] https://www.luogu.org/problemnew/show/P3768 [题目描述] 求 \(\sum_{i=1}^{n}\sum_{j=1}^{n}i* j* gcd(i,j)\mod\ p\) [欧拉反演题解] https://www.luogu.org/blog/zhoutb2333/solution-p3768 /* ----------------------- 最大测试点,时限6s [Input] 1000000007 9786510294 [Outpu

[P3768]简单的数学题

Description: 求出\((\sum_{i=1}^n \sum_{j=1}^n ij\ gcd\ (i,j)) mod\ p\) Hint: \(n<=10^{10}?\) Solution: \(Ans=\sum_{d=1}^nd^3 \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} ij\ \ [gcd(i,j)==1]?\) \(Ans=\sum_{d=1}^nd^3\

「洛谷P3768」简单的数学题

题目链接 简单的数学题 题目描述 输入一个整数n和一个整数p,你需要求出 \[\sum_{i=1}^n\sum_{j=1}^n (i\cdot j\cdot gcd(i,j))\ mod\ p\]? 其中\(gcd(a,b)\)表示\(a\)与\(b\)的最大公约数 输入 一行两个整数\(p,n\) 输出 一行一个整数,为题目中所求值 样例 样例输入 998244353 2000 样例输出 883968974 数据范围 \(n\leq 10^{10}\) \(5\times 10^8 \leq

NYOJ 330 一个简单的数学题【数学题】

/* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:如何处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法还没完全理解,先记着 */ 一个简单的数学题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 zyc最近迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能编程帮助他. 输入 第一行整数T,表示测试组数.后面T行,每行一个整数 n

一个就简单的数学题 NYOJ 330

1 #include<stdio.h>//一个就简单的数学题(330) 2 #include<string.h> 3 int a[100010]; 4 int main() 5 { 6 int x,m,yu; 7 scanf("%d",&x); 8 while(x--){ 9 scanf("%d",&m); 10 memset(a,0,sizeof(a)); 11 yu=1; 12 if(m>0)printf("

NYOJ 330 一个简单的数学题

一个简单的数学题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 zyc最近迷上了数学,一天,dj想出了一道数学题来难住他.算出1/n,但zyc一时答不上来希望大家能编程帮助他. 输入 第一行整数T,表示测试组数.后面T行,每行一个整数 n (1<=|n|<=10^5). 输出 输出1/n. (是循环小数的,只输出第一个循环节). 样例输入 4 2 3 7 168 样例输出 0.5 0.3 0.142857 0.005952380 直接模拟求余数的方法,用一个数组

leetcode_118题——Pascal&#39;s Triangle(简单的数学题)

Pascal's Triangle Total Accepted: 43845 Total Submissions: 145271My Submissions Question Solution Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] Hi

【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\(gcd\)提出来 \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]\] 习惯性的提出来 \[\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)==1]\] 后面这玩意很明显的来一发