【hdu 6588 Function】【莫比乌斯反演】

题意

∑ i = 1 n g c d ( ⌊ i 3 ⌋ , i ) \sum_{i=1}^ngcd(\lfloor\sqrt[3]i\rfloor,i) i=1ngcd(3i ,i)
T ≤ 11 , n ≤ 1 0 21 T\le 11,n\le10^{21} T11,n1021

分析

直接推式子
∑ i = 1 n g c d ( ⌊ i 3 ⌋ , i ) \sum_{i=1}^ngcd(\lfloor\sqrt[3]i\rfloor,i) i=1ngcd(3i ,i)
= ∑ d = 1 ⌊ n 3 ⌋ d ∑ i = 1 n [ g c d ( ⌊ i 3 ⌋ , i ) = d ] =\sum_{d=1}^{\lfloor\sqrt[3]n\rfloor}d\sum_{i=1}^n[gcd(\lfloor\sqrt[3]i\rfloor,i)=d] =d=13n di=1n[gcd(3i ,i)=d]
r = ⌊ n 3 ⌋ r=\lfloor\sqrt[3]n\rfloor r=3n ,反演一波可以得到
= ∑ i = ( ⌊ n 3 ⌋ ) 3 n g c d ( ⌊ n 3 ⌋ , i ) + ∑ i = 1 r i ∑ i ∣ d μ ( d i ) ∑ d ∣ k ( ⌊ ( k + 1 ) 3 − 1 d ⌋ − ⌊ k 3 − 1 d ⌋ ) =\sum_{i=(\lfloor\sqrt[3]n\rfloor)^3}^ngcd(\lfloor\sqrt[3]n\rfloor,i)+\sum_{i=1}^ri\sum_{i|d}\mu(\frac{d}{i})\sum_{d|k}(\lfloor\frac{(k+1)^3-1}{d}\rfloor-\lfloor\frac{k^3-1}{d}\rfloor) =i=(3n )3ngcd(3n ,i)+i=1riidμ(id)dk(d(k+1)31dk31)
如果设 n ′ = ⌊ n 3 ⌋ , m = n − n ′ 3 n'=\lfloor\sqrt[3]n\rfloor,m=n-n'^3 n=3n ,m=nn3,那么第一部分就等于要求 ∑ i = 1 m g c d ( n ′ , i ) \sum_{i=1}^mgcd(n',i) i=1mgcd(n,i)
= ∑ d ∣ n ′ d ∑ i = 1 m [ g c d ( n ′ , i ) = d ] =\sum_{d|n'}d\sum_{i=1}^m[gcd(n',i)=d] =dndi=1m[gcd(n,i)=d]
= ∑ d ∣ n ′ ⌊ m d ⌋ φ ( d ) =\sum_{d|n'}\lfloor\frac{m}{d}\rfloor\varphi(d) =dndmφ(d)
可以在 O ( n ′ ) O(\sqrt{n'}) O(n )的复杂度内求出。
第二部分等于 ∑ d = 1 r φ ( d ) ∑ d ∣ k ( ⌊ ( k + 1 ) 3 − 1 d ⌋ − ⌊ k 3 − 1 d ⌋ ) \sum_{d=1}^r\varphi(d)\sum_{d|k}(\lfloor\frac{(k+1)^3-1}{d}\rfloor-\lfloor\frac{k^3-1}{d}\rfloor) d=1rφ(d)dk(d(k+1)31dk31)
= ∑ d = 1 r φ ( d ) ∑ b = 1 ⌊ r d ⌋ ⌊ ( b d + 1 ) 3 − 1 d ⌋ − ⌊ ( b d ) 3 − 1 d ⌋ =\sum_{d=1}^r\varphi(d)\sum_{b=1}^{\lfloor\frac{r}{d}\rfloor}\lfloor\frac{(bd+1)^3-1}{d}\rfloor-\lfloor\frac{(bd)^3-1}{d}\rfloor =d=1rφ(d)b=1drd(bd+1)31d(bd)31
= ∑ d = 1 r φ ( d ) ∑ b = 1 ⌊ r d ⌋ ( 3 b 2 d + 3 b + 1 ) =\sum_{d=1}^r\varphi(d)\sum_{b=1}^{\lfloor\frac{r}{d}\rfloor}(3b^2d+3b+1) =d=1rφ(d)b=1dr(3b2d+3b+1)
感觉第二部分也可以通过预处理+整除分块做到 O ( r ) O(\sqrt r) O(r ),但既然 O ( r ) O(r) O(r)就能过,那就没必要这么搞了。

代码

#include<bits/stdc++.h>

typedef long long LL;
typedef __int128 IT;
//typedef long long IT;

const int ny6=166374059;
const int MOD=998244353;
const int N=10000005;
const int maxn=10000000;

int phi[N],tot,prime[N/10];
bool not_prime[N];
IT n;

template <class T>
void read(T &x)
{
    static char ch;
    static bool neg;
    for(ch=neg=0; ch<'0' || '9'<ch; neg|=ch=='-',ch=getchar());
    for(x=0; '0'<=ch && ch<='9'; (x*=10)+=ch-'0',ch=getchar());
    x=neg?-x:x;
}

int add(int x,int y) {return x+y<MOD?x+y:x+y-MOD;}

IT read()
{
	IT 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*10+ch-'0';ch=getchar();}
	return x*f;
}

void get_prime(int n)
{
	phi[1]=1;
	for (int i=2;i<=n;i++)
	{
		if (!not_prime[i]) prime[++tot]=i,phi[i]=i-1;
		for (int j=1;j<=tot&&i*prime[j]<=n;j++)
		{
			not_prime[i*prime[j]]=1;
			if (i%prime[j]==0)
			{
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
}

int sqrt3(IT n)
{
	int l=1,r=maxn;
	while (l<=r)
	{
		int mid=(l+r)/2;
		if ((IT)mid*mid*mid<=n) l=mid+1;
		else r=mid-1;
	}
	return l-1;
}

int solve1(int n,LL m)
{
	int ans=n;
	for (int i=1;i*i<=n;i++)
		if (n%i==0)
		{
			ans=add(ans,(LL)(m/i)%MOD*phi[i]%MOD);
			if (n/i!=i) ans=add(ans,(LL)(m/(n/i))%MOD*phi[n/i]%MOD);
		}
	return ans;
}

int get1(int n)
{
	return (LL)n*(n+1)/2%MOD;
}

int get2(int n)
{
	return (LL)n*(n+1)%MOD*(n*2+1)%MOD*ny6%MOD;
}

int solve2(int n)
{
	int ans=0;
	for (int i=1;i<=n;i++) ans=add(ans,(LL)phi[i]*((LL)3*i*get2(n/i)%MOD+(LL)3*get1(n/i)%MOD+(LL)n/i)%MOD);
	return ans;
}

int main()
{
	get_prime(maxn);
	int T;scanf("%d",&T);
	while (T--)
	{
		read(n);
		int r=sqrt3(n),ans=add(solve1(r,(LL)(n-(IT)r*r*r)),solve2(r-1));
		printf("%d\n",ans);
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值