luogu 3768 简单的数学题

题目描述

由于出题人懒得写背景了,题目还是简单一点好。

输入一个整数n和一个整数p,你需要求出$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$,其中gcd(a,b)表示a与b的最大公约数。

刚才题面打错了,已修改

输入输出格式

输入格式:

一行两个整数p、n。

输出格式:

一行一个整数$(\sum_{i=1}^n\sum_{j=1}^n ijgcd(i,j))~mod~p$。

输入输出样例

输入样例#1:
998244353 2000
输出样例#1:
883968974

说明

对于20%的数据,$n \leq 1000$。

对于30%的数据,$n \leq 5000$。

对于60%的数据,$n \leq 10^6$,时限1s。

对于另外20%的数据,$n \leq 10^9$,时限3s。

对于最后20%的数据,$n \leq 10^{10}$,时限6s。

对于100%的数据,$5 \times 10^8 \leq p \leq 1.1 \times 10^9$且p为质数。

$$\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]$$

莫比乌斯反演得

$$\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\mu(i)i^2(1+2+...[\frac{n}{id}])^2$$

设$sum(x)=1+2+3+...x$

令$T=id$

$$\sum_{T=1}^nsum(\frac{n}{T})^2\sum_{d|T}d^3\frac{T}{d}^2\mu(\frac{T}{d}$$
$$\sum_{T=1}^nsum(\frac{n}{T})^2T^2\sum_{d|T}d\mu(\frac{T}{d})$$

但是后面的$$T^2\sum_{d|T}d\mu(\frac{T}{d})$$没法O(n)求前缀

这时候就要用到O(n$\frac{2}{3}$)的杜教筛

首先$$(id*\mu)(i)=\varphi(i)$$
$\mu$和$id(x)=x$的狄利克雷卷积等于$\varphi(i)$

即$$\sum_{d|T}d\mu(\frac{T}{d})=\varphi(i)$$

$$T^2\sum_{d|T}d\mu(\frac{T}{d})=T^2\varphi(T)$$

令$$f(i)=i^2\varphi(i)$$

$$S(n)=\sum_{i=1}^nf(i)$$

根据狄利克雷卷积:

\begin{aligned} \sum_{i = 1}^N (f * g)(i) & = \sum_{i = 1}^N \sum_{d \mid i} g(d) f\left(\frac i d\right) \\ & = \sum_{d = 1}^N g(d) \sum_{1 \leq i \leq N, d | i} f\left(\frac i d\right) \\ & = \sum_{d = 1}^N g(d) \sum_{1 \leq i \leq \lfloor \frac n d \rfloor} f(i) \\ & = \sum_{d = 1}^N g(d) S\left(\left\lfloor \frac n d \right\rfloor\right) \end{aligned}

于是有$$g(1)S(n)=\sum_{i=1}^n(g*f)(i)-\sum_{i=2}^ng(i)S(\frac{n}{i})$$

构造经可能能约掉d2的g(x),发现g(x)=x2时最好

因为$$\sum_{d|i}\varphi(d)=i$$

$$(g*f)(i)=\sum_{d|i}f(d)g(\frac{i}{d})=\sum_{d|i}d^2\varphi(d)\frac{i}{d}^2$$ $$=i^2\sum_{d|i}\varphi(d)=i^3$$
所以 $$S(n)=\sum_{i=1}^ni^3-\sum_{i=2}^ni^2S(\frac{n}{i})$$

先预处理出S(x)的前N位(N值自定,一般为maxn$\frac{2}{3}$)

否则就内部分块递归

外部直接数论分块

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 using namespace std;
 8 typedef long long lol;
 9 const lol N=8000000;
10 lol Mod,tot,n;
11 lol ans,phi[N+5];
12 lol prime[N+5],inv2,inv6,MAX;
13 bool vis[N+5];
14 map<lol,lol> M;
15 lol qpow(lol x,lol y)
16 {
17   lol res=1;
18   while (y)
19     {
20       if (y&1) res=res*x%Mod;
21       x=x*x%Mod;
22       y/=2;
23     }
24   return res;
25 }
26 void pre()
27 {lol i,j;
28   phi[1]=1;
29   for (i=2;i<=MAX;i++)
30     {
31       if (vis[i]==0)
32     {
33       tot++;
34       prime[tot]=i;
35       phi[i]=(i-1)%Mod;
36     }
37       for (j=1;j<=tot;j++)
38     {
39       if (i*prime[j]>MAX) break;
40       vis[i*prime[j]]=1;
41       if (i%prime[j]==0)
42         {
43           phi[i*prime[j]]=phi[i]*prime[j]%Mod;
44           break;
45         }
46       else phi[i*prime[j]]=phi[i]*(prime[j]-1)%Mod;
47     }
48     }
49   for (i=1;i<=MAX;i++)
50     phi[i]=(i*i%Mod*phi[i]%Mod+phi[i-1])%Mod;
51 }
52 lol query(lol x)
53 {
54   if (x<=N) return phi[x];
55   if (M[x]) return M[x];
56   lol s=0,i,pos,sum,p=x%Mod;
57   s=p*(p+1)%Mod*inv2%Mod;
58   s=s*s%Mod;
59   lol as=0;
60   for (i=2;i<=x;i=pos+1)
61     {
62       pos=x/(x/i);
63       p=pos%Mod;
64       sum=(p+1)*p%Mod*(2*p+1)%Mod*inv6%Mod;
65       p=(i-1)%Mod;
66       sum-=(p+1)*p%Mod*(2*p+1)%Mod*inv6%Mod;
67       sum=(sum+Mod)%Mod;
68       sum=sum*query(x/i)%Mod;
69       as+=sum;as%=Mod;
70     }
71   return M[x]=(s-as+Mod)%Mod;
72 }
73 int main()
74 {lol i,pos,x,sum;
75   cin>>Mod>>n;
76   MAX=min(N,n);
77   pre();
78   inv2=qpow(2,Mod-2);
79   inv6=qpow(6,Mod-2);
80   ans=0;
81   for (i=1;i<=n;i=pos+1)
82     {
83       pos=(n/(n/i));
84       x=n/i;x%=Mod;
85       sum=(x+1)*x%Mod*inv2%Mod;
86       sum=sum*sum%Mod;
87       ans=ans+(sum*((query(pos)-query(i-1)+Mod)%Mod))%Mod;
88       ans%=Mod;
89     }
90     printf("%lld",ans);
91 }

 

posted @ 2018-01-24 10:05  Z-Y-Y-S  阅读(547)  评论(1编辑  收藏  举报