定义一个函数
s2(x)=s2(x)={0x,x=ar2,∀r∈N+,otherwise
s
2
(
x
)
=
s
2
(
x
)
=
{
0
,
x
=
a
r
2
,
∀
r
∈
N
+
x
,otherwise
问 ∑i=1n∑j=1is2(j) ∑ i = 1 n ∑ j = 1 i s 2 ( j ) 的值.
运用交换主元的方法:
∑i=1n∑j=1is2(j)=====∑i∑j[1⩽j⩽i][1⩽i⩽n]s2(j)∑i∑j[1⩽j⩽i⩽n]s2(j)∑i∑j[1⩽j⩽n][j⩽i⩽n]s2(j)∑j=1ns2(j)∑i=jn1=∑j=1n(n−j+1)s2(j)(n+1)∑j=1ns2(j)−∑j=1ns3(j) ∑ i = 1 n ∑ j = 1 i s 2 ( j ) = ∑ i ∑ j [ 1 ⩽ j ⩽ i ] [ 1 ⩽ i ⩽ n ] s 2 ( j ) = ∑ i ∑ j [ 1 ⩽ j ⩽ i ⩽ n ] s 2 ( j ) = ∑ i ∑ j [ 1 ⩽ j ⩽ n ] [ j ⩽ i ⩽ n ] s 2 ( j ) = ∑ j = 1 n s 2 ( j ) ∑ i = j n 1 = ∑ j = 1 n ( n − j + 1 ) s 2 ( j ) = ( n + 1 ) ∑ j = 1 n s 2 ( j ) − ∑ j = 1 n s 3 ( j )
运用容斥就可以求出两项和式,单次复杂度由下式给出
T(n)=O(n−−√logn)+∑i=2n√lognT(ni2)
T
(
n
)
=
O
(
n
log
n
)
+
∑
i
=
2
n
log
n
T
(
n
i
2
)
不会解,但是很容易知道这个式子是不太超过 O(n−−√) O ( n ) 量级的。
PS:T(n)≈O(n√logn)+T(6nπ2)≈O(n−−√) PS: T ( n ) ≈ O ( n log n ) + T ( 6 n π 2 ) ≈ O ( n )
啊啊啊,怎么这么简单!考试没做真可惜了。
#include <cstdio>
const int N=100005,lgN=20;
int np[N+5],prim[N/(lgN-5)],ptop=0;
void sieve(){
for(int i=2;i<=N;i++){
if(np[i])continue;
prim[ptop++]=i;
for(int j=i+i;j<=N;j+=i)np[j]=1;
}
}
long long n,p;
inline long long mul(long long x,long long y){
long long tmp=(x*y-(long long)((long double)x/p*y+1.0e-8)*p);
return tmp<0?tmp+p:tmp;
}
inline long long cal2(long long n){
long long n2=n+1,n3=2*n+1;
if((n&1)==0)n>>=1;else n2>>=1;
if((n%3==0))n/=3;else if(n2%3==0)n2/=3;else n3/=3;
return mul(n,mul(n2,n3));
}
inline long long cal3(long long n){
long long n2=n,n3=n+1,n4=n+1;
if((n&1)==0)n>>=1,n2>>=1;
else n3>>=1,n4>>=1;
return mul(mul(n,n2),mul(n3,n4));
}
long long inc2(long long x,int dep){
long long res=0,pri=(long long)prim[dep]*prim[dep],t;
for(int i=dep;pri<=x;i++,pri=(long long)prim[i]*prim[i]){
t=mul(pri,pri);
res+=mul(t,cal2(x/pri)-inc2(x/pri,i+1)+p);
}
return res;
}
long long inc3(long long x,int dep){
long long res=0,pri=(long long)prim[dep]*prim[dep],t;
for(int i=dep;pri<=x;i++,pri=(long long)prim[i]*prim[i]){
t=mul(pri,mul(pri,pri));
res+=mul(t,cal3(x/pri)-inc3(x/pri,i+1)+p);
}
return res;
}
int main(){
sieve();
while(~scanf("%lld%lld",&n,&p)){
long long res=mul(n+1,(cal2(n)-inc2(n,0)+p)%p)-(cal3(n)-inc3(n,0))%p+p;
printf("%lld\n",res%p);
}
}