using Lib; using Lib.FpsLib; using ModInt = Lib.StaticModInt; using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using static Lib.Functions; using static Lib.OutputLib; public class Solver { const bool MultiTestCase = false; void Solve() { int n = ri, k = ri; ReadArray(out int[] a, n); var b = new int[k + 1]; for (int i = 0; i < n; i++) b[Math.Min(a[i], k)]++; var c = new int[k + 1]; for (int i = 0; i < k; i++) c[Gcd(i, k)]++; var fact = new ModFact(1000000); var iexp = new ModInt[1000000]; for (int i = 0; i < iexp.Length; i++) iexp[i] = fact.FactInv(i); var log = new Dictionary(); ModInt ans = 0; for (int w = k; w > 0; w--) { if (c[w] == 0) continue; int d = k / w; Debug.Assert(d * w == k); int s = 0; var cnt = new int[w + 1]; for (int i = 0; i <= k; i++) { if (b[i] == 0) continue; int m = Math.Min(w, i / d); s += m * b[i]; cnt[m] += b[i]; } if (s < w) continue; var f = new ModInt[w + 1]; for (int i = 1; i <= w; i++) { if (cnt[i] == 0) continue; if (!log.ContainsKey(i)) log.Add(i, Log.Calc(iexp.AsSpan(0, i + 1), w + 1)); var g = log[i].AsSpan(0, w + 1); for (int j = 0; j < g.Length; j++) f[j] += g[j] * cnt[i]; } f = Exp.Calc(f); if (f.Length > w) ans += f[w] * fact.Fact(w) * c[w]; } ans *= fact.Inv(k); Write(ans); } #pragma warning disable CS0162 public Solver() { if (!MultiTestCase) Solve(); else for (int t = ri; t > 0; t--) Solve(); } #pragma warning restore CS0162 const int IINF = 1 << 30; const long INF = 1L << 60; int ri { [MethodImpl(256)] get => (int)sc.Integer(); } long rl { [MethodImpl(256)] get => sc.Integer(); } uint rui { [MethodImpl(256)] get => (uint)sc.UInteger(); } ulong rul { [MethodImpl(256)] get => sc.UInteger(); } double rd { [MethodImpl(256)] get => sc.Double(); } string rs { [MethodImpl(256)] get => sc.Scan(); } string rline { [MethodImpl(256)] get => sc.Line(); } public StreamScanner sc = new StreamScanner(Console.OpenStandardInput()); void ReadArray(out int[] a, int n) { a = new int[n]; for (int i = 0; i < a.Length; i++) a[i] = ri; } void ReadArray(out long[] a, int n) { a = new long[n]; for (int i = 0; i < a.Length; i++) a[i] = rl; } void ReadArray(out T[] a, int n, Func read) { a = new T[n]; for (int i = 0; i < a.Length; i++) a[i] = read(); } void ReadArray(out T[] a, int n, Func read) { a = new T[n]; for (int i = 0; i < a.Length; i++) a[i] = read(i); } } static class Program { static public void Main(string[] args) { SourceExpander.Expander.Expand(); Console.SetOut(new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }); new Solver(); Console.Out.Flush(); } } #region Expanded by https://github.com/kzrnm/SourceExpander namespace Lib.FpsLib{public static class Diff{[MethodImpl(256)]public static StaticModInt[]Calc(ReadOnlySpan>a)where Mod:struct,IStaticMod{if(a.Length==0)return Array.Empty>();var r=a.Slice(1).ToArray();for(int i=0;i(Span>a)where Mod:struct,IStaticMod{if(a.Length==0)return;for(int i=0;i+1[]Calc(ReadOnlySpan>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;if(deg==0)return Array.Empty>();if(deg==1)return new StaticModInt[]{1};int n=1<(n);var da0=new StaticModInt[n];for(int i=0;i+1[n];a.CopyTo(a0);var f0=new StaticModInt[n];f0[0]=1;var g0=new StaticModInt[n>>1];g0[0]=1;var df0=new StaticModInt[n>>1];var f1=new StaticModInt[n];var g1=new StaticModInt[n];var buf=new StaticModInt[n];var inv2=new StaticModInt(2).Inv();StaticModIntiz=1;for(int i=1;i=i;j--)g[j]=a0[j]-g[j-1]*fact.Inv(j);g[i..].CopyTo(g);f.Clear();for(int j=0;j.Calculate(f);Butterfly.Calculate(g);var b=buf.AsSpan(0,i<<1);da0.AsSpan(0,i-1).CopyTo(b);b[i-1]=0;Butterfly.Calculate(b[..i]);for(int j=0;j.CalculateInv(b[..i]);for(int j=0;j.Calculate(b);for(int j=0;j<(i<<1);j++)b[j]*=g[j];Butterfly.CalculateInv(b);for(int j=(i<<1)-1;j>=i;j--)b[j]=b[j-1]*fact.Inv(j)*iz;b[..i].Clear();for(int j=i;j<(i<<1);j++)b[j]=a0[j]-b[j];Butterfly.Calculate(b);for(int j=0;j<(i<<1);j++)b[j]*=f[j];Butterfly.CalculateInv(b);for(int j=i;j<(i<<1);j++)f0[j]=b[j]*iz;if((i<<1).Calculate(f);for(int j=0;j<(i<<1);j++)f[j]*=g[j];Butterfly.CalculateInv(f);f[..i].Clear();Butterfly.Calculate(f);for(int j=0;j<(i<<1);j++)f[j]*=g[j];Butterfly.CalculateInv(f);for(int j=i;j<(i<<1);j++)g0[j]=-f[j]*iz2;}}}return f0[..deg];}}} namespace Lib.FpsLib{public static class Integral{[MethodImpl(256)]public static StaticModInt[]Calc(ReadOnlySpan>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length+1;var r=new StaticModInt[deg];int n=Math.Min(deg,a.Length+1);for(int i=1;i[]Calc(ReadOnlySpan>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;if(deg==0)return Array.Empty>();int n=(int)BitOperations.RoundUpToPowerOf2((uint)deg);var f0=new StaticModInt[n];var g0=new StaticModInt[n];var r=new StaticModInt[deg];r[0]=a[0].Inv();var inv4=new StaticModInt(4).Inv();var c=StaticModInt.One;for(int i=1;i=0;j--){StaticModIntv=0;for(int l=0;l=i;j--){StaticModIntv=0;for(int l=0;ldeg)f=f.Slice(0,deg);f[i..].CopyTo(r.AsSpan(i));}else{var g=g0.AsSpan(0,i<<1);r.AsSpan(0,i).CopyTo(g);ACLButterfly.Calculate(f);ACLButterfly.Calculate(g);for(int j=0;j.CalculateInv(f);f[..i].Clear();ACLButterfly.Calculate(f);for(int j=0;j.CalculateInv(f);if(f.Length>deg)f=f.Slice(0,deg);for(int j=i;j[]Calc(ReadOnlySpan>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;return Integral.Calc(MathLib.Convolution.Calc(Diff.Calc(a),Inv.Calc(a,deg)),deg);}}} namespace Lib{public static class Functions{[MethodImpl(256)]public static int Popcount(ulong x){x=(x&0x5555555555555555UL)+((x>>1)&0x5555555555555555UL);x=(x&0x3333333333333333UL)+((x>>2)&0x3333333333333333UL);x=(x&0x0f0f0f0f0f0f0f0fUL)+((x>>4)&0x0f0f0f0f0f0f0f0fUL);x=(x&0x00ff00ff00ff00ffUL)+((x>>8)&0x00ff00ff00ff00ffUL);x=(x&0x0000ffff0000ffffUL)+((x>>16)&0x0000ffff0000ffffUL);x=(x&0x00000000ffffffffUL)+((x>>32)&0x00000000ffffffffUL);return(int)x;}[MethodImpl(256)]public static int Popcount(long x){x=(x&0x5555555555555555L)+((x>>1)&0x5555555555555555L);x=(x&0x3333333333333333L)+((x>>2)&0x3333333333333333L);x=(x&0x0f0f0f0f0f0f0f0fL)+((x>>4)&0x0f0f0f0f0f0f0f0fL);x=(x&0x00ff00ff00ff00ffL)+((x>>8)&0x00ff00ff00ff00ffL);x=(x&0x0000ffff0000ffffL)+((x>>16)&0x0000ffff0000ffffL);x=(x&0x00000000ffffffffL)+((x>>32)&0x00000000ffffffffL);return(int)x;}[MethodImpl(256)]public static int Popcount(int x){x=(x&0x55555555)+((x>>1)&0x55555555);x=(x&0x33333333)+((x>>2)&0x33333333);x=(x&0x0f0f0f0f)+((x>>4)&0x0f0f0f0f);x=(x&0x00ff00ff)+((x>>8)&0x00ff00ff);x=(x&0x0000ffff)+((x>>16)&0x0000ffff);return x;}[MethodImpl(256)]public static int Ctz(long x){if(x==0)return-1;return Popcount((ulong)((x&-x)-1));}[MethodImpl(256)]public static int CeilPow2(int n){int x=0;while((1<a<=b&&b<=c;[MethodImpl(256)]public static int Sign(long x)=>x==0?0:(x<0?-1:1);[MethodImpl(256)]public static int Sign(double x)=>x==0?0:(x<0?-1:1);[MethodImpl(256)]public static int DigitSum(long n,int d=10){long s=0;while(n>0){s+=n%d;n/=d;}return(int)s;}[MethodImpl(256)]public static long Floor(long a,long b)=>a>=0?a/b:(a+1)/b-1;[MethodImpl(256)]public static long Ceil(long a,long b)=>a>0?(a-1)/b+1:a/b;[MethodImpl(256)]public static long Gcd(long a,long b){if(a==0)return Math.Abs(b);if(b==0)return Math.Abs(a);if(a<0)a=-a;if(b<0)b=-b;int u=BitOperations.TrailingZeroCount(a);int v=BitOperations.TrailingZeroCount(b);a>>=u;b>>=v;while(a!=b){if(a>=BitOperations.TrailingZeroCount(a);}return a<(ref T x,ref T y){T t=y;y=x;x=t;}[MethodImpl(256)]public static T Clamp(T x,T l,T r)where T:IComparable =>x.CompareTo(l)<=0?l:(x.CompareTo(r)<=0?x:r);[MethodImpl(256)]public static T Clamp(ref T x,T l,T r)where T:IComparable =>x=x.CompareTo(l)<=0?l:(x.CompareTo(r)<=0?x:r);[MethodImpl(256)]public static void Chmin(ref T x,T y)where T:IComparable{if(x.CompareTo(y)>0)x=y;}[MethodImpl(256)]public static void Chmax(ref T x,T y)where T:IComparable{if(x.CompareTo(y)<0)x=y;}[MethodImpl(256)]public static int LowerBound(long[]arr,long val,int l=-1,int r=-1)=>LowerBound(arr.AsSpan(),t=>Sign(t-val),l,r);[MethodImpl(256)]public static int LowerBound(int[]arr,int val,int l=-1,int r=-1)=>LowerBound(arr.AsSpan(),t=>t-val,l,r);[MethodImpl(256)]public static int LowerBound(T[]arr,T val,int l=-1,int r=-1)where T:IComparable =>LowerBound(arr.AsSpan(),t=>t.CompareTo(val),l,r);[MethodImpl(256)]public static int LowerBound(T[]arr,Funccomp,int l=-1,int r=-1)=>LowerBound(arr.AsSpan(),comp,l,r);[MethodImpl(256)]public static int LowerBound(Spandata,Funccomp,int l=-1,int r=-1){if(data.Length==0)return-1;if(l==-1)l=0;if(r==-1)r=data.Length;while(l(T[]arr,T geq,T lt,int l=-1,int r=-1)where T:IComparable =>Math.Max(0,LowerBound(arr.AsSpan(),t=>t.CompareTo(lt),l,r)-LowerBound(arr.AsSpan(),t=>t.CompareTo(geq),l,r));[MethodImpl(256)]public static string ToBase2(long v,int digit=-1){if(digit==-1){digit=0;while((v>>digit)>0)digit++;}var c=new string[digit];for(int i=0;i>i)&1)==0?"0":"1";return string.Join("",c);}[MethodImpl(256)]public static string ToBaseN(long v,int n,int digit=-1){if(digit==-1){digit=0;long pow=1;while(v>=pow){digit++;pow*=n;}}var c=new int[digit];for(int i=0;iwhere T:IField{public static abstract T operator-(T x);public static abstract T operator+(T l,T r);public static abstract T operator-(T l,T r);public static abstract T operator*(T l,T r);public static abstract T operator/(T l,T r);public static abstract T Zero{get;}public static abstract T One{get;}public static abstract bool IsZero(T x);public static abstract bool IsOne(T x);} namespace Lib{public static class InternalBit{[MethodImpl(256)]public static uint ExtractLowestSetBit(int n){if(System.Runtime.Intrinsics.X86.Bmi1.IsSupported)return System.Runtime.Intrinsics.X86.Bmi1.ExtractLowestSetBit((uint)n);return(uint)(n&-n);}[MethodImpl(256)]public static int Bsf(uint n){return BitOperations.TrailingZeroCount(n);}[MethodImpl(256)]public static int CeilPow2(int n){var un=(uint)n;if(un<=1)return 0;return BitOperations.Log2(un-1)+1;}}} namespace Lib{public partial class StreamScanner{public StreamScanner(Stream stream){str=stream;}private readonly Stream str;private readonly byte[]buf=new byte[1024];private int len,ptr;public bool isEof=false;public bool IsEndOfStream{get{return isEof;}}[MethodImpl(256)]private byte Read(){if(isEof)throw new EndOfStreamException();if(ptr>=len){ptr=0;if((len=str.Read(buf,0,1024))<=0){isEof=true;return 0;}}return buf[ptr++];}[MethodImpl(256)]public char Char(){byte b;do b=Read();while(b<33||126=33&&b<=126;b=(char)Read())sb.Append(b);return sb.ToString();}[MethodImpl(256)]public long Integer(){long ret=0;var ng=false;byte b;do b=Read();while(b!='-'&&(b<'0'||'9'double.Parse(Scan());}} namespace Lib.MathLib{public static class Convolution{[MethodImpl(256)]public static uint[]Calc(ReadOnlySpana,ReadOnlySpanb)where TMod:struct,IStaticMod{var u=new StaticModInt[a.Length];for(int i=0;i[b.Length];for(int i=0;i(u,v);var r=new uint[u.Length];for(int i=0;i(ReadOnlySpana,ReadOnlySpanb)where TMod:struct,IStaticMod{var u=new StaticModInt[a.Length];for(int i=0;i[b.Length];for(int i=0;i(u,v);var r=new long[u.Length];for(int i=0;i[]Calc(ReadOnlySpan>a,ReadOnlySpan>b)where TMod:struct,IStaticMod{var n=a.Length;var m=b.Length;if(n==0||m==0)return Array.Empty>();if(Math.Min(n,m)<=30)return Naive(a,b);return FFT(a,b);}[MethodImpl(256)]public static StaticModInt[]Calc(StaticModInt[]a,StaticModInt[]b)where TMod:struct,IStaticMod=>Calc((ReadOnlySpan>)a,b);[MethodImpl(256)]public static StaticModInt[]Square(ReadOnlySpan>a)where TMod:struct,IStaticMod{var n=a.Length;if(n==0)return Array.Empty>();if(n<=30)return Naive(a,a);return SquareFFT(a);}[MethodImpl(256)]private static StaticModInt[]SquareFFT(ReadOnlySpan>a)where TMod:struct,IStaticMod{int n=a.Length;int len=2*n-1;int z=1<[z];a.CopyTo(a2);Butterfly.Calculate(a2);for(int i=0;i.CalculateInv(a2);var r=a2[..len];var iz=new StaticModInt(z).Inv();foreach(ref var x in r.AsSpan())x*=iz;return r;}[MethodImpl(256)]private static StaticModInt[]FFT(ReadOnlySpan>a,ReadOnlySpan>b)where TMod:struct,IStaticMod{int n=a.Length,m=b.Length;int len=n+m-1;int z=1<[z];var b2=new StaticModInt[z];a.CopyTo(a2);b.CopyTo(b2);Butterfly.Calculate(a2);Butterfly.Calculate(b2);for(int i=0;i.CalculateInv(a2);var r=a2[..len];var iz=new StaticModInt(z).Inv();foreach(ref var x in r.AsSpan())x*=iz;return r;}[MethodImpl(256)]private static StaticModInt[]Naive(ReadOnlySpan>a,ReadOnlySpan>b)where TMod:struct,IStaticMod{if(a.Length[a.Length+b.Length-1];for(int i=0;ia,ReadOnlySpanb){unchecked{var n=a.Length;var m=b.Length;if(n==0||m==0){return Array.Empty();}const ulong Mod1=754974721;const ulong Mod2=167772161;const ulong Mod3=469762049;const ulong M2M3=Mod2*Mod3;const ulong M1M3=Mod1*Mod3;const ulong M1M2=Mod1*Mod2;const ulong M1M2M3=Mod1*Mod2*Mod3;const ulong i1=190329765;const ulong i2=58587104;const ulong i3=187290749;var c1=Calc(a,b);var c2=Calc(a,b);var c3=Calc(a,b);var c=new long[n+m-1];for(int i=0;i[]IntMod(ReadOnlySpan>a,ReadOnlySpan>b)where Mod:struct,IStaticMod{var n=a.Length;var m=b.Length;if(n==0||m==0)return Array.Empty>();const long Mod1=754974721;const long Mod2=167772161;const long Mod3=469762049;const long M1invM2=95869806;const long M12invM3=187290749;int mod=StaticModInt.Mod;long M12mod=Mod1*Mod2%mod;var u=new long[n];for(int i=0;i(u,v);var c2=Calc(u,v);var c3=Calc(u,v);var c=new StaticModInt[n+m-1];for(int i=0;i754974721;public bool IsPrime=>true;}private readonly struct FFTMod2:IStaticMod{public uint Mod=>167772161;public bool IsPrime=>true;}private readonly struct FFTMod3:IStaticMod{public uint Mod=>469762049;public bool IsPrime=>true;}}} namespace Lib{public static class ACLButterflywhere Mod:struct,IStaticMod{public static uint mod{get;private set;}static uint g;static int rank2;static StaticModInt[]root,iroot;static StaticModInt[]rate2,irate2;static StaticModInt[]rate3,irate3;readonly static bool Initialized=Init();static uint[]buf;static bool Init(){buf=new uint[Vector.Count];mod=default(Mod).Mod;g=(uint)InternalMath.PrimitiveRoot();rank2=BitOperations.TrailingZeroCount(mod-1);root=new StaticModInt[rank2+1];iroot=new StaticModInt[rank2+1];rate2=new StaticModInt[Math.Max(0,rank2-2+1)];irate2=new StaticModInt[Math.Max(0,rank2-2+1)];rate3=new StaticModInt[Math.Max(0,rank2-3+1)];irate3=new StaticModInt[Math.Max(0,rank2-3+1)];root[rank2]=new StaticModInt(g).Pow((mod-1)>>rank2);iroot[rank2]=root[rank2].Inv();for(int i=rank2-1;i>=0;i--){root[i]=root[i+1]*root[i+1];iroot[i]=iroot[i+1]*iroot[i+1];}{ulong prod=1,iprod=1;for(int i=0;i<=rank2-2;i++){rate2[i]=root[i+2]*prod;irate2[i]=iroot[i+2]*iprod;prod*=iroot[i+2];iprod*=root[i+2];}}{ulong prod=1,iprod=1;for(int i=0;i<=rank2-3;i++){rate3[i]=root[i+3]*prod;irate3[i]=iroot[i+3]*iprod;prod*=iroot[i+3];iprod*=root[i+3];}}return true;}[MethodImpl(256)]public static void Calculate(Span>a){int n=a.Length;int h=BitOperations.TrailingZeroCount(n);var regLength=Vector.Count;var modV=new Vector(mod);int len=0;while(lenrot=1;if(p,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast,uint>(f1.Slice(i));var v0=new Vector(g0);var v1=new Vector(g1);var add=v0+v1;var sub=v0-v1;var ge=Vector.GreaterThanOrEqual(add,modV);add=Vector.ConditionalSelect(ge,add-modV,add);ge=Vector.GreaterThanOrEqual(sub,modV);sub=Vector.ConditionalSelect(ge,sub+modV,sub);add.CopyTo(g0);sub.CopyTo(g1);}if(s+1!=(1<rot=1,imag=root[2];if(prot2=rot*rot;StaticModIntrot3=rot2*rot;int offset=s<<(h-len);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);var f2=a.Slice(offset+2*p,p);var f3=a.Slice(offset+3*p,p);for(int i=0;irot2=rot*rot;StaticModIntrot3=rot2*rot;int offset=s<<(h-len);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);var f2=a.Slice(offset+2*p,p);var f3=a.Slice(offset+3*p,p);foreach(ref var x in f1)x*=rot;foreach(ref var x in f2)x*=rot2;foreach(ref var x in f3)x*=rot3;for(int i=0;i,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast,uint>(f1.Slice(i));var g2=MemoryMarshal.Cast,uint>(f2.Slice(i));var g3=MemoryMarshal.Cast,uint>(f3.Slice(i));var v0=new Vector(g0);var v1=new Vector(g1);var v2=new Vector(g2);var v3=new Vector(g3);var add02=v0+v2;var sub02=v0-v2;var add13=v1+v3;var sub13=v1-v3;var ge=Vector.GreaterThanOrEqual(add02,modV);add02=Vector.ConditionalSelect(ge,add02-modV,add02);ge=Vector.GreaterThanOrEqual(sub02,modV);sub02=Vector.ConditionalSelect(ge,sub02+modV,sub02);ge=Vector.GreaterThanOrEqual(add13,modV);add13=Vector.ConditionalSelect(ge,add13-modV,add13);ge=Vector.GreaterThanOrEqual(sub13,modV);sub13=Vector.ConditionalSelect(ge,sub13+modV,sub13);sub13.CopyTo(buf);foreach(ref var x in buf.AsSpan())x=(uint)(x*imag%mod);sub13=new Vector(buf);var w=add02+add13;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w-modV,w);w.CopyTo(g0);w=add02-add13;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w+modV,w);w.CopyTo(g1);w=sub02+sub13;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w-modV,w);w.CopyTo(g2);w=sub02-sub13;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w+modV,w);w.CopyTo(g3);}if(s+1!=(1<>a){int n=a.Length;var regLength=Vector.Count;var modV=new Vector(mod);int h=BitOperations.TrailingZeroCount(n);int len=h;while(len>0){if(len==1){int p=1<<(h-len);StaticModIntirot=1;if(pa0=f0[i];StaticModInta1=f1[i];f0[i]=a0+a1;f1[i]=(a0-a1)*irot;}if(s+1!=(1<<(len-1)))irot*=irate2[BitOperations.TrailingZeroCount(~s)];}}else{for(int s=0;s<(1<<(len-1));s++){int offset=s<<(h-len+1);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);for(int i=0;i,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast,uint>(f1.Slice(i));var v0=new Vector(g0);var v1=new Vector(g1);var add=v0+v1;var sub=v0-v1;var ge=Vector.GreaterThanOrEqual(add,modV);add=Vector.ConditionalSelect(ge,add-modV,add);ge=Vector.GreaterThanOrEqual(sub,modV);sub=Vector.ConditionalSelect(ge,sub+modV,sub);add.CopyTo(g0);sub.CopyTo(g1);}foreach(ref var x in f1)x*=irot;if(s+1!=(1<<(len-1)))irot*=irate2[BitOperations.TrailingZeroCount(~s)];}}len--;}else{int p=1<<(h-len);StaticModIntirot=1,iimag=iroot[2];if(pirot2=irot*irot;StaticModIntirot3=irot2*irot;int offset=s<<(h-len+2);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);var f2=a.Slice(offset+2*p,p);var f3=a.Slice(offset+3*p,p);for(int i=0;iirot2=irot*irot;StaticModIntirot3=irot2*irot;int offset=s<<(h-len+2);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);var f2=a.Slice(offset+2*p,p);var f3=a.Slice(offset+3*p,p);for(int i=0;i,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast,uint>(f1.Slice(i));var g2=MemoryMarshal.Cast,uint>(f2.Slice(i));var g3=MemoryMarshal.Cast,uint>(f3.Slice(i));var v0=new Vector(g0);var v1=new Vector(g1);var v2=new Vector(g2);var v3=new Vector(g3);var add01=v0+v1;var sub01=v0-v1;var add23=v2+v3;var sub23=v2-v3;var ge=Vector.GreaterThanOrEqual(add01,modV);add01=Vector.ConditionalSelect(ge,add01-modV,add01);ge=Vector.GreaterThanOrEqual(sub01,modV);sub01=Vector.ConditionalSelect(ge,sub01+modV,sub01);ge=Vector.GreaterThanOrEqual(add23,modV);add23=Vector.ConditionalSelect(ge,add23-modV,add23);ge=Vector.GreaterThanOrEqual(sub23,modV);sub23=Vector.ConditionalSelect(ge,sub23+modV,sub23);sub23.CopyTo(buf);foreach(ref var x in buf.AsSpan())x=(uint)(x*iimag%mod);sub23=new Vector(buf);var w=add01+add23;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w-modV,w);w.CopyTo(g0);w=sub01+sub23;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w-modV,w);w.CopyTo(g1);w=add01-add23;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w+modV,w);w.CopyTo(g2);w=sub01-sub23;ge=Vector.GreaterThanOrEqual(w,modV);w=Vector.ConditionalSelect(ge,w+modV,w);w.CopyTo(g3);}foreach(ref var x in f1)x*=irot;foreach(ref var x in f2)x*=irot2;foreach(ref var x in f3)x*=irot3;if(s+1!=(1<<(len-2)))irot*=irate3[BitOperations.TrailingZeroCount(~s)];}}len-=2;}}}}} namespace Lib{public class Barrett{public readonly uint Mod;public readonly ulong IM;public Barrett(uint m){Mod=m;IM=unchecked((ulong)-1)/m+1;}[MethodImpl(256)]public uint Mul(uint a,uint b)=>Reduce((ulong)a*b);[MethodImpl(256)]public uint Reduce(ulong z){var x=InternalMath.Mul128Bit(z,IM);var v=unchecked((uint)(z-x*Mod));if(Mod<=v)v+=Mod;return v;}[MethodImpl(256)]public uint Pow(long x,long n){if(Mod==1)return 0;uint r=1,y=(uint)InternalMath.SafeMod(x,Mod);while(n>0){if((n&1)!=0)r=Mul(r,y);y=Mul(y,y);n>>=1;}return r;}}} namespace Lib{public static class Butterflywhere T:struct,IStaticMod{static readonly Listbit_reversal=new List();public static ReadOnlySpanGetBitReversalArray(int log){for(int l=bit_reversal.Count;l<=log;l++){var rev=new int[1<>1]>>1)|((i&1)<<(l-1));bit_reversal.Add(rev);}return bit_reversal[log];}public static StaticModIntGetRoot(int log){int g=InternalMath.PrimitiveRoot();var z=new StaticModInt(g).Pow((default(T).Mod-1)>>log);return z;}public static readonly StaticModInt[]sumE=CalcurateSumE();public static readonly StaticModInt[]sumIE=CalcurateSumIE();public static readonly uint Mod=default(T).Mod;[MethodImpl(256)]public static void Calculate(Span>a){var n=a.Length;var h=InternalBit.CeilPow2(n);var regLength=Vector.Count;var modV=new Vector(Mod);for(int ph=1;ph<=h;ph++){int w=1<<(ph-1);int p=1<<(h-ph);var now=StaticModInt.Raw(1);for(int s=0;s,uint>(ls);var ru=MemoryMarshal.Cast,uint>(rs);for(int i=0;i(luSliced);var v=new Vector(ruSliced);var add=u+v;var sub=u-v;var ge=Vector.GreaterThanOrEqual(add,modV);add=Vector.ConditionalSelect(ge,add-modV,add);ge=Vector.GreaterThanOrEqual(sub,modV);sub=Vector.ConditionalSelect(ge,sub+modV,sub);add.CopyTo(luSliced);sub.CopyTo(ruSliced);}}now*=sumE[InternalBit.Bsf(~(uint)s)];}}}[MethodImpl(256)]public static void CalculateInv(Span>a){var n=a.Length;var h=InternalBit.CeilPow2(n);var regLength=Vector.Count;var modV=new Vector(Mod);for(int ph=h;ph>=1;ph--){int w=1<<(ph-1);int p=1<<(h-ph);var iNow=StaticModInt.Raw(1);for(int s=0;s.Raw((int)((ulong)(Mod+l.Value-r.Value)*(ulong)iNow.Value%Mod));}}else{var lu=MemoryMarshal.Cast,uint>(ls);var ru=MemoryMarshal.Cast,uint>(rs);for(int i=0;i(luSliced);var v=new Vector(ruSliced);var add=u+v;var sub=u-v;var ge=Vector.GreaterThanOrEqual(add,modV);add=Vector.ConditionalSelect(ge,add-modV,add);sub+=modV;add.CopyTo(luSliced);sub.CopyTo(ruSliced);}foreach(ref var r in rs)r*=iNow;}iNow*=sumIE[InternalBit.Bsf(~(uint)s)];}}}public static StaticModInt[]CalcurateSumE(){int g=InternalMath.PrimitiveRoot();int cnt2=InternalBit.Bsf(default(T).Mod-1);var e=new StaticModInt(g).Pow((default(T).Mod-1)>>cnt2);var ie=e.Inv();var sumE=new StaticModInt[30];Span>es=stackalloc StaticModInt[cnt2-1];Span>ies=stackalloc StaticModInt[cnt2-1];for(int i=es.Length-1;i>=0;i--){es[i]=e;ies[i]=ie;e*=e;ie*=ie;}var now=StaticModInt.Raw(1);for(int i=0;i<=cnt2-2;i++){sumE[i]=es[i]*now;now*=ies[i];}return sumE;}public static StaticModInt[]CalcurateSumIE(){int g=InternalMath.PrimitiveRoot();int cnt2=InternalBit.Bsf(default(T).Mod-1);var e=new StaticModInt(g).Pow((default(T).Mod-1)>>cnt2);var ie=e.Inv();var sumIE=new StaticModInt[30];Span>es=stackalloc StaticModInt[cnt2-1];Span>ies=stackalloc StaticModInt[cnt2-1];for(int i=es.Length-1;i>=0;i--){es[i]=e;ies[i]=ie;e*=e;ie*=ie;}var now=StaticModInt.Raw(1);for(int i=0;i<=cnt2-2;i++){sumIE[i]=ies[i]*now;now*=es[i];}return sumIE;}[Conditional("ATCODER_CONTRACT")]private static void CheckPow2(int n){if(BitOperations.PopCount((uint)n)!=1){throw new ArgumentException("Array length must be a power of 2.");}}public static void Doubling(ReadOnlySpan>a,Span>b){int n=a.Length;var c=b[n..];a.CopyTo(b);a.CopyTo(c);CalculateInv(c);int g=InternalMath.PrimitiveRoot();var z=new StaticModInt(g).Pow((default(T).Mod-1)/(2*n));StaticModIntw=1;for(int i=0;iprimitiveRootsCache=new Dictionary(){{2,1},{167772161,3},{469762049,3},{754974721,11},{998244353,3}};[MethodImpl(256)]public static int PrimitiveRoot()where TMod:struct,IStaticMod{uint m=default(TMod).Mod;if(primitiveRootsCache.TryGetValue(m,out var p))return p;return primitiveRootsCache[m]=PrimitiveRootCalculate();}static int PrimitiveRootCalculate()where TMod:struct,IStaticMod{var m=default(TMod).Mod;Spandivs=stackalloc uint[20];divs[0]=2;int cnt=1;var x=m-1;x>>=BitOperations.TrailingZeroCount(x);for(uint i=3;(long)i*i<=x;i+=2){if(x%i==0){divs[cnt++]=i;do{x/=i;}while(x%i==0);}}if(x>1){divs[cnt++]=x;}divs=divs.Slice(0,cnt);for(int g=2;;g++){foreach(var d in divs)if(new StaticModInt(g).Pow((m-1)/d).Value==1)goto NEXT;return g;NEXT:;}}[MethodImpl(256)]public static int PrimitiveRoot(uint m){if(primitiveRootsCache.TryGetValue(m,out var p))return p;return primitiveRootsCache[m]=PrimitiveRootCalculate(m);}static int PrimitiveRootCalculate(uint m){Spandivs=stackalloc uint[20];divs[0]=2;int cnt=1;var x=m-1;x>>=BitOperations.TrailingZeroCount(x);for(uint i=3;(long)i*i<=x;i+=2){if(x%i==0){divs[cnt++]=i;do{x/=i;}while(x%i==0);}}if(x>1){divs[cnt++]=x;}divs=divs.Slice(0,cnt);uint Pow(uint x,uint n){uint y=1;while(n>0){if((n&1)==1)y=y*x%m;x=x*x%m;n/=2;}return y;}for(uint g=2;;g++){foreach(var d in divs)if(Pow(g,(m-1)/d)==1)goto NEXT;return(int)g;NEXT:;}}[MethodImpl(256)]public static(long,long)InvGcd(long a,long b){a=SafeMod(a,b);if(a==0)return(b,0);long s=b,t=a;long m0=0,m1=1;long u;while(true){if(t==0){if(m0<0)m0+=b/s;return(s,m0);}u=s/t;s-=t*u;m0-=m1*u;if(s==0){if(m1<0)m1+=b/t;return(t,m1);}u=t/s;t-=s*u;m1-=m0*u;}}[MethodImpl(256)]public static long SafeMod(long x,long m){x%=m;if(x<0)x+=m;return x;}[MethodImpl(256)]public static bool IsPrime(int n){if(n<=1)return false;if(n==2||n==7||n==61)return true;if(n%2==0)return false;long d=n-1;while(d%2==0)d/=2;ReadOnlySpanbases=stackalloc byte[3]{2,7,61};foreach(long a in bases){long t=d;long y=PowMod(a,t,n);while(t!=n-1&&y!=1&&y!=n-1){y=y*y%n;t<<=1;}if(y!=n-1&&t%2==0){return false;}}return true;}[MethodImpl(256)]public static uint PowMod(long x,long n,int m){if(m==1)return 0;return new Barrett((uint)m).Pow(x,n);}[MethodImpl(256)]public static uint PowMod(long x,long n,uint m){if(m==1)return 0;return new Barrett(m).Pow(x,n);}[MethodImpl(256)]public static ulong FloorSumUnsigned(ulong n,ulong m,ulong a,ulong b){ulong ans=0;while(true){if(a>=m){ans+=(n-1)*n/2*(a/m);a%=m;}if(b>=m){ans+=n*(b/m);b%=m;}ulong yMax=a*n+b;if(yMax>32;var ad=a&0xFFFFFFFF;var bu=b>>32;var bd=b&0xFFFFFFFF;var l=ad*bd;var m1=au*bd;var m2=ad*bu;var h=au*bu;var lu=l>>32;var m1d=m1&0xFFFFFFFF;var m2d=m2&0xFFFFFFFF;var c=m1d+m2d+lu;return h+(m1>>32)+(m2>>32)+(c>>32);}}} namespace Lib{public class ModFactwhere TMod:struct,IStaticMod{static StaticModInt[]fact;static StaticModInt[]factinv;static StaticModInt[]inv;public ModFact(long n){if(fact==null){fact=new StaticModInt[n+1];factinv=new StaticModInt[n+1];inv=new StaticModInt[n+1];fact[0]=1;for(long i=0;i0;i--)factinv[i-1]=factinv[i]*i;for(long i=1;i<=n;i++)inv[i]=fact[i-1]*factinv[i];}else if(fact.Length<=n)Resize(n);}static void Resize(long n){int m=fact.Length;n=Math.Max(n,m*2);Array.Resize(ref fact,(int)n+1);Array.Resize(ref factinv,(int)n+1);Array.Resize(ref inv,(int)n+1);for(long i=m-1;im;i--)factinv[i-1]=factinv[i]*i;for(long i=m;i<=n;i++)inv[i]=fact[i-1]*factinv[i];}[MethodImpl(256)]public StaticModIntFact(long n){if(fact.Length<=n)Resize(n);return fact[n];}[MethodImpl(256)]public StaticModIntFactInv(long n){if(fact.Length<=n)Resize(n);return factinv[n];}[MethodImpl(256)]public StaticModIntInv(long n){if(n==0)throw new DivideByZeroException();if(fact.Length<=n)Resize(n);return inv[n];}[MethodImpl(256)]public StaticModIntBinom(long n,long k){if(n<0)return 0;if(n==0)return k==0?1:0;if(k<0||nBinomInv(long n,long k){if(n<0)throw new DivideByZeroException();if(0<=k&&k<=n){if(fact.Length<=n)Resize(n);return factinv[n]*fact[k]*fact[n-k];}throw new DivideByZeroException();}[MethodImpl(256)]public StaticModIntMultinom(long n,long k1,long k2){if(n<0)return 0;if(n==0)return k1==0&&k2==0?1:0;long k0=n-k1-k2;if(k0<0||k0>n)return 0;if(k1<0||k1>n)return 0;if(k2<0||k2>n)return 0;if(fact.Length<=n)Resize(n);return fact[n]*factinv[k0]*factinv[k1]*factinv[k2];}[MethodImpl(256)]public StaticModIntMultinom(long n,params long[]ks){if(n<0)return 0;long k0=n;foreach(var k in ks)k0-=k;if(k0<0||k0>n)return 0;if(fact.Length<=n)Resize(n);StaticModIntret=fact[n]*factinv[k0];for(int i=0;in)return 0;ret*=factinv[k];}return ret;}}} namespace Lib{public interface IStaticMod{uint Mod{get;}bool IsPrime{get;}}public readonly struct Mod1000000007:IStaticMod{public uint Mod=>1000000007;public bool IsPrime=>true;}public readonly struct Mod998244353:IStaticMod{public uint Mod=>998244353;public bool IsPrime=>true;}public readonly struct StaticModInt:IEquatable>,IField>where T:struct,IStaticMod{internal readonly uint _v;private static readonly T op=default;public int Value=>(int)_v;public static int Mod=>(int)op.Mod;public static StaticModIntZero=>default;public static StaticModIntOne=>new StaticModInt(1u);[MethodImpl(256)]public static StaticModIntRaw(int v){var u=unchecked((uint)v);return new StaticModInt(u);}[MethodImpl(256)]public StaticModInt(long v):this(Round(v)){}[MethodImpl(256)]public StaticModInt(ulong v):this((uint)(v%op.Mod)){}[MethodImpl(256)]private StaticModInt(uint v)=>_v=v;public static bool IsZero(StaticModIntx)=>x.Value==0;public static bool IsOne(StaticModIntx)=>x.Value==1;[MethodImpl(256)]private static uint Round(long v){var x=v%op.Mod;if(x<0)x+=op.Mod;return(uint)x;}[MethodImpl(256)]public static StaticModIntoperator ++(StaticModIntv){var x=v._v+1;if(x==op.Mod)x=0;return new StaticModInt(x);}[MethodImpl(256)]public static StaticModIntoperator --(StaticModIntv){var x=v._v;if(x==0)x=op.Mod;return new StaticModInt(x-1);}[MethodImpl(256)]public static StaticModIntoperator+(StaticModIntlhs,StaticModIntrhs){var v=lhs._v+rhs._v;if(v>=op.Mod)v-=op.Mod;return new StaticModInt(v);}[MethodImpl(256)]public static StaticModIntoperator-(StaticModIntlhs,StaticModIntrhs){unchecked{var v=lhs._v-rhs._v;if(v>=op.Mod)v+=op.Mod;return new StaticModInt(v);}}[MethodImpl(256)]public static StaticModIntoperator*(StaticModIntlhs,StaticModIntrhs)=>new StaticModInt((uint)((ulong)lhs._v*rhs._v%op.Mod));[MethodImpl(256)]public static StaticModIntoperator/(StaticModIntlhs,StaticModIntrhs)=>new StaticModInt((uint)((ulong)lhs._v*Inv(rhs._v)%op.Mod));[MethodImpl(256)]public static StaticModIntoperator+(StaticModIntv)=>v;[MethodImpl(256)]public static StaticModIntoperator-(StaticModIntv)=>new StaticModInt(v._v==0?0:op.Mod-v._v);[MethodImpl(256)]public static bool operator==(StaticModIntlhs,StaticModIntrhs)=>lhs._v==rhs._v;[MethodImpl(256)]public static bool operator!=(StaticModIntlhs,StaticModIntrhs)=>lhs._v!=rhs._v;[MethodImpl(256)]public static implicit operator StaticModInt(int v)=>new StaticModInt(v);[MethodImpl(256)]public static implicit operator StaticModInt(uint v)=>new StaticModInt((long)v);[MethodImpl(256)]public static implicit operator StaticModInt(long v)=>new StaticModInt(v);[MethodImpl(256)]public static implicit operator StaticModInt(ulong v)=>new StaticModInt(v);[MethodImpl(256)]public static implicit operator long(StaticModIntv)=>v._v;[MethodImpl(256)]public static implicit operator ulong(StaticModIntv)=>v._v;[MethodImpl(256)]public StaticModIntPow(long n){var x=this;var r=new StaticModInt(1U);if(n<0)(x,n)=(x.Inv(),-n);while(n>0){if((n&1)>0)r*=x;x*=x;n>>=1;}return r;}[MethodImpl(256)]public StaticModIntInv()=>new StaticModInt(Inv(_v));[MethodImpl(256)]static ulong Inv(ulong x){long u=op.Mod,xu=1,yu=0,v=(long)x,xv=0,yv=1;while(v!=0){long w=SafeMod(u,v);long q=(u-w)/v;long xw=xu-xv*q;long yw=yu-yv*q;u=v;xu=xv;yu=yv;v=w;xv=xw;yv=yw;}return(ulong)(yu<0?yu+op.Mod:yu);}[MethodImpl(256)]static long SafeMod(long x,long m){long r=x%m;if(r<0)r+=m;return r;}[MethodImpl(256)]public override string ToString()=>_v.ToString();[MethodImpl(256)]public string ToString(string format,IFormatProvider formatProvider)=>_v.ToString(format,formatProvider);[MethodImpl(256)]public override bool Equals(object?obj)=>obj is StaticModIntm&&Equals(m);[MethodImpl(256)]public bool Equals(StaticModIntother)=>_v==other._v;[MethodImpl(256)]public override int GetHashCode()=>_v.GetHashCode();}} namespace Lib{public static class OutputLib{[MethodImpl(256)]public static void WriteJoin(string s,IEnumerablet)=>Console.WriteLine(string.Join(s,t));[MethodImpl(256)]public static void WriteMat(T[,]a,string sep=" "){int sz1=a.GetLength(0),sz2=a.GetLength(1);var b=new T[sz2];for(int i=0;i(T[][]a,string sep=" "){foreach(var ar in a)WriteJoin(sep,ar);}[MethodImpl(256)]public static void WriteMat(T[][]a,Funcmap,string sep=" "){foreach(var ar in a)WriteJoin(sep,ar.Select(x=>map(x)));}[MethodImpl(256)]public static void Write(object t)=>Console.WriteLine(t.ToString());[MethodImpl(256)]public static void Write(params object[]arg)=>Console.WriteLine(string.Join(" ",arg.Select(x=>x.ToString())));[MethodImpl(256)]public static void Write(string str)=>Console.WriteLine(str);[MethodImpl(256)]public static void WriteFlush(object t){Console.WriteLine(t.ToString());Console.Out.Flush();}[MethodImpl(256)]public static void WriteError(object t)=>Console.Error.WriteLine(t.ToString());[MethodImpl(256)]public static void Flush()=>Console.Out.Flush();[MethodImpl(256)]public static void YN(bool t)=>Console.WriteLine(t?"YES":"NO");[MethodImpl(256)]public static void Yn(bool t)=>Console.WriteLine(t?"Yes":"No");[MethodImpl(256)]public static void yn(bool t)=>Console.WriteLine(t?"yes":"no");[MethodImpl(256)]public static void DeleteLine()=>Console.Write("\x1b[1A\x1b[2K");[MethodImpl(256)]public static void ProgressBar(long now,long total,int blocks=50){int x=(int)((2*now*blocks+1)/(2*total));Console.Write($"\x1b[G[\x1b[42m{string.Concat(Enumerable.Repeat("_",x))}\x1b[0m{string.Concat(Enumerable.Repeat("_",blocks-x))}] : {now} / {total}");}}} namespace SourceExpander{public class Expander{[Conditional("EXP")]public static void Expand(string inputFilePath=null,string outputFilePath=null,bool ignoreAnyError=true){}public static string ExpandString(string inputFilePath=null,bool ignoreAnyError=true){return "";}}} #endregion Expanded by https://github.com/kzrnm/SourceExpander