默认散行之间是相等关系。
F:
f(a,b,c,n)f(a,b,c,n)f(a,b,c,n)
∑i=0n⌊ai+bc⌋\sum_{i=0}^n \lfloor \frac{ai+b}{c}\rfloori=0∑n⌊cai+b⌋
Case 1 a=0
∑i=0n⌊bc⌋\sum_{i=0}^n \lfloor \frac{b}{c} \rfloori=0∑n⌊cb⌋
(n+1)⌊bc⌋(n+1)\lfloor \frac{b}{c} \rfloor(n+1)⌊cb⌋
Case2 a≥ca\ge ca≥c 或 b≥cb\ge cb≥c
∑i=0n⌊ac⌋i+⌊bc⌋+⌊(a mod c)i+b mod cc⌋\sum_{i=0}^{n} \lfloor \frac{a}{c}\rfloor i+ \lfloor \frac{b}{c}\rfloor+ \lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloori=0∑n⌊ca⌋i+⌊cb⌋+⌊c(amodc)i+bmodc⌋
SID1(n)⌊ac⌋+(n+1)⌊bc⌋+f(a mod c,b mod c,c,n)S_{ID_1}(n) \lfloor \frac{a}{c}\rfloor+(n+1) \lfloor \frac{b}{c}\rfloor+f(a\bmod c,b\bmod c,c,n)SID1(n)⌊ca⌋+(n+1)⌊cb⌋+f(amodc,bmodc,c,n)
Case 3 a<c,b<ca<c,b<ca<c,b<c
mx=⌊an+bc⌋mx= \lfloor \frac{an+b}{c}\rfloormx=⌊can+b⌋
∑i=0n∑j=0mx−1[j<⌊ai+bc⌋]\sum_{i=0}^{n}\sum_{j=0}^{mx-1} [j< \lfloor \frac{ai+b}{c}\rfloor]i=0∑nj=0∑mx−1[j<⌊cai+b⌋]
∑j=0mx−1∑i=0n[j<⌊ai+bc⌋]\sum_{j=0}^{mx-1}\sum_{i=0}^{n} [j< \lfloor \frac{ai+b}{c}\rfloor]j=0∑mx−1i=0∑n[j<⌊cai+b⌋]
∑j=0mx−1∑i=0n[j+1≤⌊ai+bc⌋]\sum_{j=0}^{mx-1}\sum_{i=0}^{n} [j+1\le \lfloor \frac{ai+b}{c}\rfloor]j=0∑mx−1i=0∑n[j+1≤⌊cai+b⌋]
∑j=0mx−1∑i=0n[jc+c≤ai+b]\sum_{j=0}^{mx-1}\sum_{i=0}^{n} [jc+c\le ai+b]j=0∑mx−1i=0∑n[jc+c≤ai+b]
∑j=0mx−1∑i=0n[jc+c<ai+b+1]\sum_{j=0}^{mx-1}\sum_{i=0}^{n} [jc+c< ai+b+1]j=0∑mx−1i=0∑n[jc+c<ai+b+1]
∑j=0mx−1∑i=0n[jc+c−b−1<ai]\sum_{j=0}^{mx-1}\sum_{i=0}^{n} [jc+c-b-1<ai]j=0∑mx−1i=0∑n[jc+c−b−1<ai]
∑j=0mx−1∑i=1n[jc+c−b−1<ai]\sum_{j=0}^{mx-1}\sum_{i=1}^{n} [jc+c-b-1<ai]j=0∑mx−1i=1∑n[jc+c−b−1<ai]
∑j=0mx−1n−∑i=1n[jc+c−b−1≥ai]\sum_{j=0}^{mx-1}n-\sum_{i=1}^{n} [jc+c-b-1\ge ai]j=0∑mx−1n−i=1∑n[jc+c−b−1≥ai]
∑j=0mx−1n−⌊jc+c−b−1a⌋\sum_{j=0}^{mx-1}n-\lfloor \frac{jc+c-b-1}{a}\rfloorj=0∑mx−1n−⌊ajc+c−b−1⌋
mxn−f(c,c−b−1,a,mx−1)mxn-f(c,c-b-1,a,mx-1)mxn−f(c,c−b−1,a,mx−1)
AT_abc443_g [ABC443G] Another Mod of Linear Problem
给定 nnn,求有多少 0≤k<n0\le k< n0≤k<n,满足 (ak+b) mod m>k(ak+b)\bmod m>k(ak+b)modm>k
(ak+b) mod m=(ak+b)−⌊ak+bm⌋m>k(ak+b)\bmod m=(ak+b)-\lfloor \frac{ak+b}{m}\rfloor m>k(ak+b)modm=(ak+b)−⌊mak+b⌋m>k
⌊ak+bm⌋m<(a−1)k+b\lfloor \frac{ak+b}{m}\rfloor m<(a-1)k+b⌊mak+b⌋m<(a−1)k+b
⌊ak+bm⌋m≤(a−1)k+(b−1)\lfloor \frac{ak+b}{m}\rfloor m\le(a-1)k+(b-1)⌊mak+b⌋m≤(a−1)k+(b−1)
⌊ak+bm⌋≤⌊(a−1)k+(b−1)m⌋\lfloor \frac{ak+b}{m}\rfloor\le \lfloor \frac{(a-1)k+(b-1)}{m}\rfloor⌊mak+b⌋≤⌊m(a−1)k+(b−1)⌋
相差 k+1≤mk+1\le mk+1≤m 相差不超 111.。
n−∑i=0n−1(⌊ak+bm⌋−⌊(a−1)k+(b−1)m⌋)n-\sum_{i=0}^{n-1} (\lfloor \frac{ak+b}{m}\rfloor- \lfloor \frac{(a-1)k+(b-1)}{m}\rfloor)n−i=0∑n−1(⌊mak+b⌋−⌊m(a−1)k+(b−1)⌋)
n−f(a,b,m,n−1)+f(a−1,b−1,m,n−1)n-f(a,b,m,n-1)+f(a-1,b-1,m,n-1)n−f(a,b,m,n−1)+f(a−1,b−1,m,n−1)
有负数,所以要用 library。或者特殊处理负数除法。将 a,b 都加 m 可以避免使用负数。
代码:
用 library 写的,不喜勿喷。
cpp
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
#define int long long
#define _ 300005
signed main(){
int t; cin>>t;
while (t--){
int n,m,a,b; cin>>n>>m>>a>>b;
cout<<n-floor_sum(n,m,a,b)+floor_sum(n,m,a-1,b-1)<<"\n";
}
}
G:
g(a,b,c,n)g(a,b,c,n)g(a,b,c,n)
∑i=0n⌊ai+bc⌋2\sum_{i=0}^{n} \lfloor \frac{ai+b}{c}\rfloor^2i=0∑n⌊cai+b⌋2
Case 1 a=0a=0a=0
(n+1)⌊bc⌋2(n+1)\lfloor \frac{b}{c}\rfloor^2(n+1)⌊cb⌋2
Case 2 a≥ca\ge ca≥c 或 b≥cb\ge cb≥c
∑i=0n(⌊ac⌋i+⌊bc⌋+⌊(a mod c)i+b mod cc⌋)2\sum_{i=0}^{n}(\lfloor \frac{a}{c}\rfloor i+ \lfloor \frac{b}{c}\rfloor+ \lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor)^2i=0∑n(⌊ca⌋i+⌊cb⌋+⌊c(amodc)i+bmodc⌋)2
∑i=0n(⌊ac⌋i+⌊bc⌋)2+(⌊(a mod c)i+b mod cc⌋)2\sum_{i=0}^{n}(\lfloor \frac{a}{c}\rfloor i+ \lfloor \frac{b}{c}\rfloor)^2+ (\lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor)^2i=0∑n(⌊ca⌋i+⌊cb⌋)2+(⌊c(amodc)i+bmodc⌋)2
+2(⌊ac⌋i+⌊bc⌋)(⌊(a mod c)i+b mod cc⌋)+2(\lfloor \frac{a}{c}\rfloor i+ \lfloor \frac{b}{c}\rfloor)(\lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor)+2(⌊ca⌋i+⌊cb⌋)(⌊c(amodc)i+bmodc⌋)
∑i=0n(⌊ac⌋i)2+(⌊bc⌋)2+2(⌊ac⌋i)(⌊bc⌋)+(⌊(a mod c)i+b mod cc⌋)2\sum_{i=0}^{n}(\lfloor \frac{a}{c}\rfloor i)^2+ (\lfloor \frac{b}{c}\rfloor)^2+2(\lfloor \frac{a}{c}\rfloor i)(\lfloor \frac{b}{c}\rfloor)+ (\lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor)^2i=0∑n(⌊ca⌋i)2+(⌊cb⌋)2+2(⌊ca⌋i)(⌊cb⌋)+(⌊c(amodc)i+bmodc⌋)2
+2(⌊ac⌋i+⌊bc⌋)(⌊(a mod c)i+b mod cc⌋)+2(\lfloor \frac{a}{c}\rfloor i+ \lfloor \frac{b}{c}\rfloor)(\lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor)+2(⌊ca⌋i+⌊cb⌋)(⌊c(amodc)i+bmodc⌋)
⌊ac⌋2SID2(n)+(n+1)⌊bc⌋2+2⌊ac⌋⌊bc⌋SID1(n)\lfloor \frac{a}{c}\rfloor^2S_{ID_2}(n)+(n+1)\lfloor \frac{b}{c}\rfloor^2+2\lfloor \frac{a}{c}\rfloor \lfloor \frac{b}{c}\rfloor S_{ID_1}(n)⌊ca⌋2SID2(n)+(n+1)⌊cb⌋2+2⌊ca⌋⌊cb⌋SID1(n)
g(a mod c,b mod c,c,n)+2⌊ac⌋h(a mod c,b mod c,c,n)+2⌊bc⌋f(a mod c,b mod c,c,n)g(a\bmod c,b\bmod c,c,n)+2\lfloor \frac{a}{c}\rfloor h(a\bmod c,b\bmod c,c,n)+2\lfloor \frac{b}{c}\rfloor f(a\bmod c,b\bmod c,c,n)g(amodc,bmodc,c,n)+2⌊ca⌋h(amodc,bmodc,c,n)+2⌊cb⌋f(amodc,bmodc,c,n)
Case 3 a<c,b<ca<c,b<ca<c,b<c
∑i=0n∑j=0mx−1[j<⌊ai+bc⌋](2j+1)\sum_{i=0}^{n}\sum_{j=0}^{mx-1} [j< \lfloor \frac{ai+b}{c}\rfloor](2j+1)i=0∑nj=0∑mx−1[j<⌊cai+b⌋](2j+1)
∑j=0mx−1(2j+1)n−(2j+1)∑i=1n[jc+c−b−1≥ai]\sum_{j=0}^{mx-1}(2j+1)n-(2j+1)\sum_{i=1}^{n} [jc+c-b-1\ge ai]j=0∑mx−1(2j+1)n−(2j+1)i=1∑n[jc+c−b−1≥ai]
2SID1(mx−1)n+mxn−∑j=0mx−1(2j+1)⌊jc+c−b−1a⌋2S_{ID_1}(mx-1)n+mxn-\sum_{j=0}^{mx-1}(2j+1)\lfloor \frac{jc+c-b-1}{a}\rfloor2SID1(mx−1)n+mxn−j=0∑mx−1(2j+1)⌊ajc+c−b−1⌋
2SID1(mx−1)n−2h(c,c−b−1,a,mx−1)−f(a,b,c,n)2S_{ID_1}(mx-1)n-2h(c,c-b-1,a,mx-1)-f(a,b,c,n)2SID1(mx−1)n−2h(c,c−b−1,a,mx−1)−f(a,b,c,n)
H:
∑i=0n⌊ai+bc⌋i\sum_{i=0}^n \lfloor \frac{ai+b}{c}\rfloor ii=0∑n⌊cai+b⌋i
Case 1 a=0
SID1(n)⌊bc⌋S_{ID_1}(n)\lfloor \frac{b}{c}\rfloorSID1(n)⌊cb⌋
Case 2 a≥ca\ge ca≥c 或 b≥cb\ge cb≥c
∑i=0n⌊(a mod c)i+b mod cc⌋i+i2⌊ac⌋+i⌊bc⌋\sum_{i=0}^n \lfloor \frac{(a\bmod c)i+b\bmod c}{c}\rfloor i+i^2\lfloor \frac{a}{c}\rfloor+i\lfloor \frac{b}{c}\rfloori=0∑n⌊c(amodc)i+bmodc⌋i+i2⌊ca⌋+i⌊cb⌋
h(a mod c,b mod c,c,n)+SID2(n)⌊ac⌋+SID1(n)⌊bc⌋h(a\bmod c,b\bmod c,c,n)+S_{ID_2}(n)\lfloor \frac{a}{c}\rfloor+S_{ID_1}(n)\lfloor \frac{b}{c}\rfloorh(amodc,bmodc,c,n)+SID2(n)⌊ca⌋+SID1(n)⌊cb⌋
Case 3 a<c,b<ca<c,b<ca<c,b<c
∑j=0mx−1∑i=1n[jc+c−b−1<ai]i\sum_{j=0}^{mx-1}\sum_{i=1}^{n} [jc+c-b-1<ai]ij=0∑mx−1i=1∑n[jc+c−b−1<ai]i
∑j=0mx−1n−SID1(⌊jc+c−b−1a⌋)\sum_{j=0}^{mx-1}n-S_{ID_1}(\lfloor \frac{jc+c-b-1}{a}\rfloor)j=0∑mx−1n−SID1(⌊ajc+c−b−1⌋)
∑j=0mx−1n−⌊jc+c−b−1a⌋⌊jc+c−b−1a⌋(2−1)−⌊jc+c−b−1a⌋(2−1)\sum_{j=0}^{mx-1} n-\lfloor \frac{jc+c-b-1}{a}\rfloor\lfloor \frac{jc+c-b-1}{a}\rfloor(2^{-1})-\lfloor \frac{jc+c-b-1}{a}\rfloor(2^{-1})j=0∑mx−1n−⌊ajc+c−b−1⌋⌊ajc+c−b−1⌋(2−1)−⌊ajc+c−b−1⌋(2−1)
mxn−g(c,c−b−1,a,mx−1)(2−1)−f(c,c−b−1,a,mx−1)(2−1)mxn-g(c,c-b-1,a,mx-1)(2^{-1})-f(c,c-b-1,a,mx-1)(2^{-1})mxn−g(c,c−b−1,a,mx−1)(2−1)−f(c,c−b−1,a,mx−1)(2−1)
复杂度证明
考虑 a,c。
当 a>=c 时,a %=c。
当 a<c 时,交换。
常数翻倍(不止两倍)的辗转相除。
思考
k(a,b,c,n)=(sum(ai+b)/c)3k(a,b,c,n)=(sum(ai+b)/c) ^3k(a,b,c,n)=(sum(ai+b)/c)3。
l(a,b,c,n)=sum(ai+b)/c×i2l(a,b,c,n)=sum(ai+b)/c \times i^2l(a,b,c,n)=sum(ai+b)/c×i2。
p(a,b,c,n)=(sum(ai+b)/c)2×ip(a,b,c,n)=(sum(ai+b)/c)^2 \times ip(a,b,c,n)=(sum(ai+b)/c)2×i。
有会的可以评论区。
代码
实现时可能与公式不同。
cpp
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define N 1000010
#define M 998244353
#define K 499122177
#define L 166374059
struct node{int f,g,h;}ans;
int is(int n){return n*(n+1)%M*K%M;}
int ifs(long long n){
__int128 tmp=n*(n+1);
tmp*=2*n+1; tmp%=M; tmp=tmp*L;
return (long long) tmp%M;
}
node solve(int a,int b,int c,int n){
if (a==0){
ans.f=(n+1)*(b/c)%M;
ans.g=n*(n+1)/2%M*(b/c)%M;
ans.h=(b/c)*(b/c)%M*(n+1)%M;
}
else if (a>=c||b>=c){
node tmp=solve(a%c,b%c,c,n);
ans.f=tmp.f+is(n)*(a/c)%M+(n+1)*(b/c)%M;
ans.g=tmp.g+ifs(n)*(a/c)%M+is(n)*(b/c)%M;
ans.h=tmp.h+2*(a/c)*tmp.g%M+2*(b/c)*tmp.f%M+ifs(n)*(a/c)%M*(a/c)%M+2*is(n)*(a/c)%M*(b/c)%M+(n+1)*(b/c)%M*(b/c)%M;
}else{
int m=(a*n+b)/c;
//颈终绝烂
if (!m) return node{0,0,0};
node tmp=solve(c,c-b-1,a,m-1);
ans.f=m*n-tmp.f;
ans.g=is(n)*m%M-K*tmp.h%M-K*tmp.f%M;
ans.h=is(m)*2*n%M-2*tmp.g%M-2*tmp.f%M-ans.f%M;
}
return node{(ans.f%M+M)%M,(ans.g%M+M)%M,(ans.h%M+M)%M};
}
signed main(){
int t; cin>>t;
while (t--){
int n,a,b,c;
cin>>n>>a>>b>>c;
node ans=solve(a,b,c,n);
cout<<(long long)ans.f<<" "<<(long long)ans.h<<" "<<(long long)ans.g<<"\n";
}
}
完结撒花(写了 7500+ 字)。