[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\sum_{k=1}^{\lfloor\frac{n}{d}\rfloor}\mu(k)\ k^2 \sum_{i=1}^{\lfloor \frac{n}{kd} \rfloor} \sum_{j=1}^{\lfloor \frac{n}{kd} \rfloor} ij?\)

\(Ans=\sum_{T=1}^n \sum_{k=1}^{T} \mu(k) \ k^2\ (\frac{T}{k})^3 \ Sum(\lfloor \frac{n}{T} \rfloor)^2 ?\)

\(Ans=\sum_{T=1}^n T^2 \phi(T) \ Sum(\lfloor \frac{n}{T} \rfloor)^2 ?\)

杜教筛出 \(T^2 \phi(T)\) 的前缀和

\(令g(x)=x^2\)

\(\sum_{d=1}^n f(d)*g(\frac{n}{d}) = \sum \phi(d)\ d^2(\frac{n}{d})^2=n^3\)

至此可求

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mxn=8e6;
ll mod,tot,y,z;
int p[mxn+5],vis[mxn+5];
ll ph[mxn+5];
map<ll ,ll > sph;

ll qpow(ll a,ll b)
{
    ll ans=1,base=a;
    while(b) {
        if(b&1) ans=1ll*ans*base%mod;
        base=1ll*base*base%mod;
        b>>=1;
    }
    return ans;
}

void sieve()
{
    vis[1]=ph[1]=1;
    for(int i=2;i<=mxn;++i) {
        if(!vis[i]) ph[i]=i-1,p[++tot]=i;
        for(int j=1;j<=tot&&p[j]*i<=mxn;++j) {
            vis[p[j]*i]=1;
            if(i%p[j]) ph[p[j]*i]=ph[p[j]]*ph[i]%mod;
            else {ph[p[j]*i]=ph[i]*p[j]%mod;break;}
        }
    }
    for(int i=1;i<=mxn;++i) ph[i]=(ph[i]*i%mod*i%mod+ph[i-1])%mod;
    y=qpow(2,mod-2),z=qpow(6,mod-2);
}

inline ll cal1(ll x) {
    x%=mod;
    return (1ll*x*(x+1)%mod*y%mod)*(1ll*x*(x+1)%mod*y%mod)%mod;
}

inline ll cal2(ll x) {
    x%=mod;
    return 1ll*x*(x+1)%mod*(2*x%mod+1)%mod*z%mod;
}

ll get(ll n)
{
    if(n<=mxn) return ph[n];
    if(sph[n]) return sph[n]; ll ans=0;
    for(ll l=2,r;l<=n;l=r+1) {
        r=n/(n/l);
        ans=(ans+(cal2(r)-cal2(l-1)+mod)%mod*get(n/l)%mod)%mod;
    }
    return sph[n]=((cal1(n)-ans)%mod+mod)%mod;
}

int main()
{
    ll n; ll ans=0;
    scanf("%d %lld",&mod,&n); sieve();
    for(ll l=1,r;l<=n;l=r+1) {
        r=n/(n/l);
        ans=(ans+1ll*cal1(n/l)%mod*(get(r)-get(l-1)+mod)%mod)%mod;
    }
    printf("%lld",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/list1/p/10398336.html

时间: 2024-08-30 17:54:51

[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 【简单的数学题】

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}_{

「洛谷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]\] 后面这玩意很明显的来一发