m很小100,一个O(nm)的复杂度
两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负)
显而易见,最多增加[-m,m]个亮度
考虑O(n)枚举对齐方式,O(m)枚举差距的亮度
亮度增加的时候,维护平方和,只用维护之前的平方和,所有项的和即可
但是每次旋转,初始的对齐位置会发生改变,所以暴力可以O(N^2)
我们只关心初始的平方和
拆开,其实就要求∑ai*bj
由于旋转,所以b倍长,
对应下标差一定,求乘积
把a数组reverse,然后NTT快乐搞定
开始没有注意两个环都可以增亮,,所以只枚举了[0,m],没想到有95pts、。。。
代码:
#include#define reg register int#define il inline#define numb (ch^'0')#define int long longusing namespace std;typedef long long ll;il void rd(int &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}namespace Miracle{const int N=100000+5;const int mod=998244353;const int G=3;const int GI=332748118;const int inf=0x3f3f3f3f;int n,m;ll qm(ll x,ll y){ ll ret=1; while(y){ if(y&1) ret=ret*x%mod; x=x*x%mod; y>>=1; } return ret;}int rev[8*N];ll a[8*N],b[8*N];void NTT(ll *f,int n,int c){ for(reg i=0;i >1]>>1)|((i&1)?(len>>1):0); }// for(reg i=0;i