【XSY3532】序列计数(数论)

记录一下推导这题的时候发现的一个东西。

按照我一开始的推法,推出来是这个东西:
∑ i = 1 n μ 2 ( i ) ⌊ n i ⌋ 2 \begin{aligned} \sum_{i=1}^n\mu^2(i)\left\lfloor\sqrt{\frac{n}{i}}\right\rfloor^2 \end{aligned} i=1nμ2(i)in 2
其中 ⌊ n i ⌋ 2 \left\lfloor\sqrt{\dfrac{n}{i}}\right\rfloor^2 in 2 就是在 [ 1 , n i ] \left[1,\dfrac{n}{i}\right] [1,in] 中最大的完全平方数。

这个可以 min25 筛 μ 2 \mu^2 μ2 配上整除分块做,但不能过 n ≤ 1 0 14 n\leq 10^{14} n1014,结果一直推不下去。然后换了种推法,得到:
2 ( ∑ i = 1 n φ ( i ) ⌊ n i 2 ⌋ ) − n 2\left(\sum_{i=1}^{\sqrt n}\varphi(i)\lfloor\frac{n}{i^2}\rfloor\right)-n 2i=1n φ(i)i2nn
这样就有 O ( n ) O(\sqrt n) O(n ) 的做法了。

一个疑惑的点是:为什么上下不能互推?

因为我太菜了。 其实是可以的,首先第一个问题是这个 ⌊ n i ⌋ 2 \left\lfloor\sqrt{\dfrac{n}{i}}\right\rfloor^2 in 2 看起来很烦。

tjy 一个非常神奇的方法,我们化简为繁: n 2 = ∑ a = 1 n ( 2 a − 1 ) n^2=\sum_{a=1}^n(2a-1) n2=a=1n(2a1),于是:
∑ i = 1 n μ 2 ( i ) ⌊ n i ⌋ 2 = ∑ i = 1 n μ 2 ( i ) ∑ a 2 i ≤ n ( 2 a − 1 ) = ∑ a = 1 n ( 2 a − 1 ) ∑ a 2 i ≤ n μ 2 ( i ) \begin{aligned} &\sum_{i=1}^n\mu^2(i)\left\lfloor\sqrt{\frac{n}{i}}\right\rfloor^2\\ =&\sum_{i=1}^n\mu^2(i)\sum_{a^2i\leq n}(2a-1)\\ =&\sum_{a=1}^{\sqrt n}(2a-1)\sum_{a^2i\leq n}\mu^2(i) \end{aligned} ==i=1nμ2(i)in 2i=1nμ2(i)a2in(2a1)a=1n (2a1)a2inμ2(i)
有一个把 μ 2 ( n ) \mu^2(n) μ2(n) 转化为 μ ( n ) \mu(n) μ(n) 的式子:
μ 2 ( n ) = ∑ d 2 ∣ n μ ( d ) \mu^2(n)=\sum_{d^2|n}\mu(d) μ2(n)=d2nμ(d)
可以这么理解,我们考虑 μ 2 ( n ) \mu^2(n) μ2(n) μ ( n ) \mu(n) μ(n) 在某个质数 p p p 的幂处的取值: μ 2 ( n ) : { 1 , 1 , 0 , ⋯   } \mu^2(n):\{1,1,0,\cdots\} μ2(n):{1,1,0,} μ ( n ) : { 1 , − 1 , 0 , ⋯   , } \mu(n):\{1,-1,0,\cdots,\} μ(n):{1,1,0,,},容易发现 μ 2 ( n ) \mu^2(n) μ2(n) p k p^k pk 处的取值可以等于 μ ( n ) \mu(n) μ(n) p 0 , ⋯   , p ⌊ k 2 ⌋ p^0,\cdots,p^{\lfloor\frac{k}{2}\rfloor} p0,,p2k 处取值的和。

用贝尔级数来看, μ p 2 ( x ) = 1 + x = 1 − x 2 1 − x = μ p ( x 2 ) ∗ 1 p \mu^2_p(x)=1+x=\frac{1-x^2}{1-x}=\mu_p(x^2)*1_p μp2(x)=1+x=1x1x2=μp(x2)1p

(这条式子还可以使得 μ 2 ( n ) \mu^2(n) μ2(n) 的前缀和在 O ( n ) O(\sqrt n) O(n ) 的时间内求出)

然后带进去就可以互推了:
∑ a = 1 n ( 2 a − 1 ) ∑ i = 1 ⌊ n a 2 ⌋ μ 2 ( i ) = ∑ a = 1 n ( 2 a − 1 ) ∑ i = 1 ⌊ n a 2 ⌋ ∑ d 2 ∣ i μ ( d ) = ∑ d = 1 n μ ( d ) ∑ a = 1 n ( 2 a − 1 ) ⌊ n a 2 d 2 ⌋ = ∑ T = 1 n ⌊ n T 2 ⌋ ∑ d ∣ T μ ( d ) ( 2 T d − 1 ) = ∑ T = 1 n ⌊ n T 2 ⌋ ( 2 ⋅ φ ( T ) − [ T = 1 ] ) = 2 ( ∑ T = 1 n ⌊ n T 2 ⌋ φ ( T ) ) − n \begin{aligned} &\sum_{a=1}^{\sqrt n}(2a-1)\sum_{i=1}^{\lfloor\frac{n}{a^2}\rfloor}\mu^2(i)\\ =&\sum_{a=1}^{\sqrt n}(2a-1)\sum_{i=1}^{\lfloor\frac{n}{a^2}\rfloor}\sum_{d^2|i}\mu(d)\\ =&\sum_{d=1}^{\sqrt n}\mu(d)\sum_{a=1}^{\sqrt n}(2a-1)\lfloor\frac{n}{a^2d^2}\rfloor\\ =&\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor\sum_{d|T}\mu(d)(\frac{2T}{d}-1)\\ =&\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor(2\cdot \varphi (T)-[T=1])\\ =&2\left(\sum_{T=1}^{\sqrt n}\lfloor\frac{n}{T^2}\rfloor\varphi(T)\right)-n \end{aligned} =====a=1n (2a1)i=1a2nμ2(i)a=1n (2a1)i=1a2nd2iμ(d)d=1n μ(d)a=1n (2a1)a2d2nT=1n T2ndTμ(d)(d2T1)T=1n T2n(2φ(T)[T=1])2T=1n T2nφ(T)n

总的来说,感觉转化过程中比较神奇的两步:(虽然感觉有点巧)

  • n 2 n^2 n2 的转化。
  • μ 2 ( n ) \mu^2(n) μ2(n) 的转化。

代码如下:

#include<bits/stdc++.h>

#define N 10000010
#define ll long long

using namespace std;

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^'0');
		ch=getchar();
	}
	return x*f;
}

ll n;
int sn;
int cnt,prime[N],phi[N];
bool notprime[N];

void init()
{
	phi[1]=1;
	for(int i=2;i<=sn;i++)
	{
		if(!notprime[i]) prime[++cnt]=i,phi[i]=i-1;
		for(int j=1,v;j<=cnt&&(v=i*prime[j])<=sn;j++)
		{
			notprime[v]=1;
			if(!(i%prime[j]))
			{
				phi[v]=phi[i]*prime[j];
				break;
			}
			phi[v]=phi[i]*phi[prime[j]];
		}
	}
}

int main()
{
	cin>>n;
	sn=sqrt(n);
	init();
	ll ans=0;
	for(int i=1;i<=sn;i++)
		ans+=1ll*phi[i]*(n/(1ll*i*i));
	printf("%lld\n",ans*2ll-n);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值