【题目】
原题地址
求 ∑ n = 1 N ∑ m = 1 M ∑ k = 0 m − 1 ⌊ n k + x m ⌋ m o d 998244353 \sum_{n=1}^N\sum_{m=1}^M\sum_{k=0}^{m-1}\lfloor\frac{nk+x}m\rfloor\ mod\ 998244353 ∑n=1N∑m=1M∑k=0m−1⌊mnk+x⌋ mod 998244353
【题目分析】
有下取整的东西并没有见过qwq,大概试着化了一下,没有见过这种技巧很难做出来。
【解题思路】
根据popoqqq的说法,如果我们知道 n n n和 m m m,我们要求的东西等价于:
∑ k = 0 m − 1 ⌊ n k + x m ⌋ \sum_{k=0}^{m-1}\lfloor\frac{nk+x}m\rfloor ∑k=0m−1⌊mnk+x⌋
= ∑ k = 0 m − 1 ( ⌊ n k % m + x m ⌋ + n k − n k % m m ) =\sum_{k=0}^{m-1}(\lfloor\frac{nk\%m+x}m\rfloor+\frac{nk-nk\%m}m) =∑k=0m−1(⌊mnk%m+x⌋+mnk−nk%m)
= ∑ k = 0 m − 1 ( ⌊ n k % m + x m ⌋ + n k m − n k % m m ) =\sum_{k=0}^{m-1}(\lfloor\frac{nk\%m+x}m\rfloor+\frac{nk}m-\frac{nk\%m}m) =∑k=0m−1(⌊mnk%m+x⌋+mnk−mnk%m)
那么这个柿子是可以拆开每一项来考虑的,后面两项的结构比较简单,重点在第一个带x的柿子。
令 d = g c d ( n , m ) d=gcd(n,m) d=gcd(n,m),则:
∑ k = 0 m − 1 ( ⌊ n k % m + x m ⌋ ) \sum_{k=0}^{m-1}(\lfloor\frac{nk\%m+x}m\rfloor) ∑k=0m−1(⌊mnk%m+x⌋)
= d ∗ ∑ k = 0 m d − 1 ⌊ k d + x m ⌋ =d*\sum_{k=0}^{\frac md-1}\lfloor\frac{kd+x}m\rfloor =d∗∑k=0dm−1⌊mkd+x⌋
= d ∗ ( m d ∗ x − x % m m + ∑ k = 0 m d − 1 ⌊ k d + x % m m ⌋ ) =d*(\frac md*\frac{x-x\%m}m+\sum_{k=0}^{\frac md-1}\lfloor\frac{kd+x\%m}m\rfloor) =d∗(dm∗mx−x%m+∑k=0dm−1⌊mkd+x%m⌋)
= d ∗ ( m d ∗ x − x % m m + ∑ k = 0 m d − 1 [ k d + x % m ≥ m ] ) =d*(\frac md*\frac{x-x\%m}m+\sum_{k=0}^{\frac md-1}[kd+x\%m\geq m]) =d∗(dm∗mx−x%m+∑k=0dm−1[kd+x%m≥m])
= d ∗ ( x − x % m d + ⌊ x % m d ⌋ ) =d*(\frac{x-x\%m}d+\lfloor\frac{x\%m}d\rfloor) =d∗(dx−x%m+⌊dx%m⌋)
= d ∗ ⌊ x d ⌋ =d*\lfloor\frac xd\rfloor =d∗⌊dx⌋
倒数第三步的原因是 k d kd kd和 x % m x\%m x%m都小于 m m m,因此取值只能是0或1.
上面的倒数第二步的后面一项我看了挺久才看懂qwq,我太菜了。
其实这步要求,的就是 k d + x % m ≥ m kd+x\%m\geq m kd+x%m≥m的数量,那么移项可以得到 x % m ≥ m − k d x\% m \geq m-kd x%m≥m−kd,即 ⌊ x % m d ⌋ ≥ m d − k \lfloor \frac {x\% m} d \rfloor \geq \frac m d -k ⌊dx%m⌋≥dm−k,因为 k k k是 [ 0 , m d − 1 ] [0,\frac m d -1] [0,dm−1],所以实际上 ⌊ x % m d ⌋ \lfloor \frac {x\% m} d \rfloor ⌊dx%m⌋就是满足不等式的 k k k数目。
其余的两项通过推导分别可以得到:
∑ k = 0 m − 1 n k m = n m ∗ m ∗ ( m − 1 ) 2 = n ∗ m − n 2 \sum_{k=0}^{m-1}\frac{nk}m=\frac nm*\frac{m*(m-1)}2=\frac{n*m-n}2 ∑k=0m−1mnk=mn∗2m∗(m−1)=2n∗m−n
∑ k = 0 m − 1 n k % m m = d ∗ ∑ k = 0 m d − 1 k d m = d 2 m ∗ ( m d − 1 ) ∗ m d 2 = m − d 2 \sum_{k=0}^{m-1}\frac{nk\%m}m=d*\sum_{k=0}^{\frac md-1}\frac{kd}m=\frac{d^2}m*\frac{(\frac md-1)*\frac md}2=\frac{m-d}2 ∑k=0m−1mnk%m=d∗∑k=0dm−1mkd=md2∗2(dm−1)∗dm=2m−d
那么最终的答案就是:
∑ n = 1 N ∑ m = 1 M ( d ∗ ⌊ x d ⌋ + n ∗ m − n 2 − m − d 2 ) \sum_{n=1}^N\sum_{m=1}^M(d*\lfloor\frac xd\rfloor+\frac{n*m-n}2-\frac{m-d}2) ∑n=1N∑m=1M(d∗⌊dx⌋+2n∗m−n−2m−d)
= 1 2 ∗ ∑ n = 1 N ∑ m = 1 M ( 2 ∗ d ∗ ⌊ x d ⌋ + d + n ∗ m − n − m ) =\frac12*\sum_{n=1}^N\sum_{m=1}^M(2*d*\lfloor\frac xd\rfloor+d+n*m-n-m) =21∗∑n=1N∑m=1M(2∗d∗⌊dx⌋+d+n∗m−n−m)
= 1 2 ∗ ( S ( N ) ∗ S ( M ) − S ( N ) ∗ m − S ( M ) ∗ n + ∑ d = 1 m i n ( N , M ) ( d + 2 ∗ d ∗ ⌊ x d ⌋ ) ∑ k = 1 m i n ( ⌊ N d ⌋ , ⌊ M d ⌋ ) μ ( k ) ∗ ⌊ N d ∗ k ⌋ ∗ ⌊ M d ∗ k ⌋ ) =\frac12*(S(N)*S(M)-S(N)*m-S(M)*n+\sum_{d=1}^{min(N,M)}(d+2*d*\lfloor\frac xd\rfloor)\sum_{k=1}^{min(\lfloor\frac Nd\rfloor,\lfloor\frac Md\rfloor)}\mu(k)*\lfloor\frac N{d*k}\rfloor*\lfloor\frac M{d*k}\rfloor) =21∗(S(N)∗S(M)−S(N)∗m−S(M)∗n+∑d=1min(N,M)(d+2∗d∗⌊dx⌋)∑k=1min(⌊dN⌋,⌊dM⌋)μ(k)∗⌊d∗kN⌋∗⌊d∗kM⌋)
其中 S ( x ) = x ∗ ( x + 1 ) 2 S(x)=\frac {x*(x+1)} 2 S(x)=2x∗(x+1)
O ( n l o g n ) O(nlogn) O(nlogn)枚举 d d d和 k k k即可。
【参考代码】
#include
using namespace std;
typedef long long LL;
const LL mod=998244353;
const int N=5e5+10;
int n,m,x,pnum,mu[N],bo[N],pri[N];
LL ans;
void init()
{
mu[1]=1;
for(int i=2;im) swap(n,m);
ans=((sum(n)*sum(m)-sum(n)*m-sum(m)*n)%mod+mod)%mod;
for(int i=1;i<=n;++i)
{
LL tmp=i+x/i*i*2;
for(int j=1;i*j<=n;++j) (ans+=tmp*mu[j]%mod*(n/i/j)%mod*(m/i/j)%mod)%=mod;
}
printf("%lld\n",(ans*((mod+1)/2ll))%mod);
return 0;
}