結果

問題 No.2959 Dolls' Tea Party
ユーザー KumaTachiRenKumaTachiRen
提出日時 2024-11-08 22:14:32
言語 C#
(.NET 8.0.203)
結果
TLE  
実行時間 -
コード長 44,828 bytes
コンパイル時間 10,539 ms
コンパイル使用メモリ 166,840 KB
実行使用メモリ 76,800 KB
最終ジャッジ日時 2024-11-08 22:15:49
合計ジャッジ時間 38,147 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 98 ms
44,928 KB
testcase_01 AC 98 ms
44,672 KB
testcase_02 AC 98 ms
44,800 KB
testcase_03 AC 98 ms
44,924 KB
testcase_04 AC 97 ms
44,800 KB
testcase_05 AC 100 ms
44,928 KB
testcase_06 AC 229 ms
46,976 KB
testcase_07 AC 341 ms
47,616 KB
testcase_08 AC 252 ms
47,232 KB
testcase_09 TLE -
testcase_10 TLE -
testcase_11 TLE -
testcase_12 TLE -
testcase_13 TLE -
testcase_14 AC 306 ms
47,360 KB
testcase_15 AC 293 ms
47,488 KB
testcase_16 TLE -
testcase_17 TLE -
testcase_18 TLE -
testcase_19 TLE -
testcase_20 TLE -
testcase_21 TLE -
testcase_22 TLE -
testcase_23 TLE -
testcase_24 AC 99 ms
44,920 KB
testcase_25 AC 129 ms
44,800 KB
testcase_26 AC 101 ms
44,800 KB
testcase_27 AC 228 ms
46,080 KB
testcase_28 AC 230 ms
46,336 KB
testcase_29 AC 183 ms
46,592 KB
testcase_30 AC 166 ms
46,848 KB
testcase_31 AC 176 ms
46,592 KB
testcase_32 TLE -
testcase_33 TLE -
testcase_34 TLE -
testcase_35 TLE -
testcase_36 TLE -
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (96 ms)。
MSBuild のバージョン 17.9.6+a4ecab324 (.NET)
/home/judge/data/code/Main.cs(112,3809): warning CS8632: '#nullable' 注釈コンテキスト内のコードでのみ、Null 許容参照型の注釈を使用する必要があります。 [/home/judge/data/code/main.csproj]
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

using Lib;
using Lib.FpsLib;
using ModInt = Lib.StaticModInt<Lib.Mod998244353>;
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 c = new int[k + 1];
        for (int i = 0; i < k; i++) c[Gcd(i, k)]++;

        var fact = new ModFact<Mod998244353>(1000000);
        var iexp = new ModInt[1000000];
        for (int i = 0; i < iexp.Length; i++) iexp[i] = fact.FactInv(i);

        var log_memo = new Dictionary<int, ModInt[]>();

        ModInt ans = 0;
        for (int w = k; w > 0; w--)
        {
            if (c[w] == 0) continue;
            int d = k / w;

            int s = 0;
            var cnt = new int[w + 1];
            for (int i = 0; i < n; i++)
            {
                int m = Math.Min(w, a[i] / d);
                s += m;
                cnt[m]++;
            }
            if (s < w) continue;

            var f = new ModInt[w + 1];
            for (int i = 1; i <= w; i++)
            {
                if (cnt[i] == 0) continue;
                if (!log_memo.TryGetValue(i, out var g))
                {
                    g = Log.Calc<Mod998244353>(iexp.AsSpan(0, i + 1), w + 1);
                    log_memo.Add(i, g);
                }
                for (int j = 0; j <= w; j++) f[j] += g[j] * cnt[i];
            }
            f = Exp.Calc<Mod998244353>(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<T>(out T[] a, int n, Func<T> read) { a = new T[n]; for (int i = 0; i < a.Length; i++) a[i] = read(); }
    void ReadArray<T>(out T[] a, int n, Func<int, T> 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<Mod>[]Calc<Mod>(ReadOnlySpan<StaticModInt<Mod>>a)where Mod:struct,IStaticMod{if(a.Length==0)return Array.Empty<StaticModInt<Mod>>();var r=a.Slice(1).ToArray();for(int i=0;i<r.Length;i++)r[i]*=i+1;return r;}[MethodImpl(256)]public static void Inline<Mod>(Span<StaticModInt<Mod>>a)where Mod:struct,IStaticMod{if(a.Length==0)return;for(int i=0;i+1<a.Length;i++)a[i]=(i+1)*a[i+1];a[^1]=0;}}}
namespace Lib.FpsLib{public static class Exp{[MethodImpl(256)]public static StaticModInt<Mod>[]Calc<Mod>(ReadOnlySpan<StaticModInt<Mod>>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;if(deg==0)return Array.Empty<StaticModInt<Mod>>();if(deg==1)return new StaticModInt<Mod>[]{1};int n=1<<InternalBit.CeilPow2(deg);var fact=new ModFact<Mod>(n);var da0=new StaticModInt<Mod>[n];for(int i=0;i+1<a.Length&&i<n;i++)da0[i]=(i+1)*a[i+1];var a0=new StaticModInt<Mod>[n];a.CopyTo(a0);var f0=new StaticModInt<Mod>[n];f0[0]=1;var g0=new StaticModInt<Mod>[n>>1];g0[0]=1;var df0=new StaticModInt<Mod>[n>>1];var f1=new StaticModInt<Mod>[n];var g1=new StaticModInt<Mod>[n];var buf=new StaticModInt<Mod>[n];var inv2=new StaticModInt<Mod>(2).Inv();StaticModInt<Mod>iz=1;for(int i=1;i<n;i<<=1){iz*=inv2;var iz2=iz*iz;if(i<=(1<<6)){var f=f1.AsSpan(0,i<<1);f.Clear();for(int j=0;j<i-1;j++)for(int l=0;l<i;l++)f[j+l]+=da0[j]*f0[l];for(int j=0;j<f.Length;j++)f[j]=-f[j];for(int j=0;j<i;j++)f[j]+=df0[j];var g=g1.AsSpan(0,i<<1);g.Clear();for(int j=0;j<(i<<1);j++)for(int l=0;l<i&&j+l<(i<<1);l++)g[j+l]+=f[j]*g0[l];for(int j=(i<<1)-1;j>=i;j--)g[j]=a0[j]-g[j-1]*fact.Inv(j);g[i..].CopyTo(g);f.Clear();for(int j=0;j<i;j++)for(int l=0;l<i;l++)f[j+l]+=f0[j]*g[l];f[..i].CopyTo(f0.AsSpan(i));if((i<<1)<n){for(int j=i;j<(i<<1);j++)df0[j-1]=f0[j]*j;f.Clear();for(int j=0;j<(i<<1);j++)for(int l=0;l<i&&j+l<(i<<1);l++)f[j+l]+=f0[j]*g0[l];g.Clear();for(int j=0;j<(i<<1);j++)for(int l=0;l<i&&j+l<(i<<1);l++)g[j+l]+=f[j]*g0[l];for(int j=i;j<(i<<1);j++)g0[j]=-g[j];}}else{var f=f1.AsSpan(0,i<<1);var g=g1.AsSpan(0,i<<1);f0.AsSpan(0,i).CopyTo(f);g0.AsSpan(0,i).CopyTo(g);Butterfly<Mod>.Calculate(f);Butterfly<Mod>.Calculate(g);var b=buf.AsSpan(0,i<<1);da0.AsSpan(0,i-1).CopyTo(b);b[i-1]=0;Butterfly<Mod>.Calculate(b[..i]);for(int j=0;j<i;j++)b[j]*=f[j];Butterfly<Mod>.CalculateInv(b[..i]);for(int j=0;j<i;j++)b[j]=df0[j]-b[j]*iz*2;b[..(i-1)].CopyTo(b[i..]);b[..(i-1)].Clear();Butterfly<Mod>.Calculate(b);for(int j=0;j<(i<<1);j++)b[j]*=g[j];Butterfly<Mod>.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<Mod>.Calculate(b);for(int j=0;j<(i<<1);j++)b[j]*=f[j];Butterfly<Mod>.CalculateInv(b);for(int j=i;j<(i<<1);j++)f0[j]=b[j]*iz;if((i<<1)<n){for(int j=i;j<(i<<1);j++)df0[j-1]=f0[j]*j;f0.AsSpan(0,i<<1).CopyTo(f);Butterfly<Mod>.Calculate(f);for(int j=0;j<(i<<1);j++)f[j]*=g[j];Butterfly<Mod>.CalculateInv(f);f[..i].Clear();Butterfly<Mod>.Calculate(f);for(int j=0;j<(i<<1);j++)f[j]*=g[j];Butterfly<Mod>.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<Mod>[]Calc<Mod>(ReadOnlySpan<StaticModInt<Mod>>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length+1;var r=new StaticModInt<Mod>[deg];int n=Math.Min(deg,a.Length+1);for(int i=1;i<n;i++)r[i]=a[i-1]/i;return r;}}}
namespace Lib.FpsLib{public static class Inv{[MethodImpl(256)]public static StaticModInt<Mod>[]Calc<Mod>(ReadOnlySpan<StaticModInt<Mod>>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;if(deg==0)return Array.Empty<StaticModInt<Mod>>();int n=(int)BitOperations.RoundUpToPowerOf2((uint)deg);var f0=new StaticModInt<Mod>[n];var g0=new StaticModInt<Mod>[n];var r=new StaticModInt<Mod>[deg];r[0]=a[0].Inv();var inv4=new StaticModInt<Mod>(4).Inv();var c=StaticModInt<Mod>.One;for(int i=1;i<n;i<<=1){c*=inv4;var f=f0.AsSpan(0,i<<1);a[..Math.Min(a.Length,i<<1)].CopyTo(f);if(a.Length<(i<<1))f[a.Length..].Clear();if(i<=(1<<6)){for(int j=(i<<1)-1;j>=0;j--){StaticModInt<Mod>v=0;for(int l=0;l<i&&l<=j;l++)v+=f[j-l]*r[l];f[j]=v;}for(int j=(i<<1)-1;j>=i;j--){StaticModInt<Mod>v=0;for(int l=0;l<i&&l<=j;l++)v+=f[j-l]*r[l];f[j]=-v;}if(f.Length>deg)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<Mod>.Calculate(f);ACLButterfly<Mod>.Calculate(g);for(int j=0;j<f.Length;j++)f[j]*=g[j];ACLButterfly<Mod>.CalculateInv(f);f[..i].Clear();ACLButterfly<Mod>.Calculate(f);for(int j=0;j<f.Length;j++)f[j]*=g[j];ACLButterfly<Mod>.CalculateInv(f);if(f.Length>deg)f=f.Slice(0,deg);for(int j=i;j<f.Length;j++)r[j]=-f[j]*c;}}return r;}}}
namespace Lib.FpsLib{public static class Log{[MethodImpl(256)]public static StaticModInt<Mod>[]Calc<Mod>(ReadOnlySpan<StaticModInt<Mod>>a,int deg=-1)where Mod:struct,IStaticMod{if(deg==-1)deg=a.Length;return Integral.Calc<Mod>(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<<x)<n)x++;return x;}[MethodImpl(256)]public static int SafeMod(int x,int m){int r=x%m;return r<0?r+Math.Abs(m):r;}[MethodImpl(256)]public static long SafeMod(long x,long m){long r=x%m;return r<0?r+Math.Abs(m):r;}[MethodImpl(256)]public static bool IsIncreasing(long a,long b,long c)=>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<b)(a,b)=(b,a);a-=b;a>>=BitOperations.TrailingZeroCount(a);}return a<<Math.Min(u,v);}[MethodImpl(256)]public static(long x,long y,long g)ExtGcd(long a,long b){if(b==0)return(Sign(a),0,Math.Abs(a));long c=SafeMod(a,b);var(x2,y2,g)=ExtGcd(b,c);long x=SafeMod(y2,b);long y=(g-a*x)/b;return(x,y,g);}[MethodImpl(256)]public static void Swap(ref int x,ref int y){x^=y;y^=x;x^=y;}[MethodImpl(256)]public static void Swap(ref long x,ref long y){x^=y;y^=x;x^=y;}[MethodImpl(256)]public static void Swap<T>(ref T x,ref T y){T t=y;y=x;x=t;}[MethodImpl(256)]public static T Clamp<T>(T x,T l,T r)where T:IComparable<T> =>x.CompareTo(l)<=0?l:(x.CompareTo(r)<=0?x:r);[MethodImpl(256)]public static T Clamp<T>(ref T x,T l,T r)where T:IComparable<T> =>x=x.CompareTo(l)<=0?l:(x.CompareTo(r)<=0?x:r);[MethodImpl(256)]public static void Chmin<T>(ref T x,T y)where T:IComparable<T>{if(x.CompareTo(y)>0)x=y;}[MethodImpl(256)]public static void Chmax<T>(ref T x,T y)where T:IComparable<T>{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>(T[]arr,T val,int l=-1,int r=-1)where T:IComparable<T> =>LowerBound(arr.AsSpan(),t=>t.CompareTo(val),l,r);[MethodImpl(256)]public static int LowerBound<T>(T[]arr,Func<T,int>comp,int l=-1,int r=-1)=>LowerBound(arr.AsSpan(),comp,l,r);[MethodImpl(256)]public static int LowerBound<T>(Span<T>data,Func<T,int>comp,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<r){int x=(l+r)/2;if(comp(data[x])<0)l=x+1;else r=x;}return l;}[MethodImpl(256)]public static int RangeCount<T>(T[]arr,T geq,T lt,int l=-1,int r=-1)where T:IComparable<T> =>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<digit;i++)c[digit-1-i]=((v>>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;i<digit;i++,v/=n)c[digit-1-i]=(int)(v%n);return string.Join("",c);}}}
public interface IField<T>where T:IField<T>{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<b);return(char)b;}[MethodImpl(256)]public string Line(){var sb=new StringBuilder();for(var b=Char();b!=10&&!isEof;b=(char)Read())sb.Append(b);return sb.ToString();}[MethodImpl(256)]public string Scan(){var sb=new StringBuilder();for(var b=Char();b>=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'<b));if(b=='-'){ng=true;b=Read();}for(;'0'<=b&&b<='9';b=Read())ret=ret*10+(b^'0');return ng?-ret:ret;}[MethodImpl(256)]public ulong UInteger(){ulong ret=0;byte b;do b=Read();while(b<'0'||'9'<b);for(;'0'<=b&&b<='9';b=Read())ret=ret*10+(ulong)(b^'0');return ret;}[MethodImpl(256)]public double Double()=>double.Parse(Scan());}}
namespace Lib.MathLib{public static class Convolution{[MethodImpl(256)]public static uint[]Calc<TMod>(ReadOnlySpan<uint>a,ReadOnlySpan<uint>b)where TMod:struct,IStaticMod{var u=new StaticModInt<TMod>[a.Length];for(int i=0;i<a.Length;i++)u[i]=a[i];var v=new StaticModInt<TMod>[b.Length];for(int i=0;i<b.Length;i++)v[i]=b[i];u=Calc<TMod>(u,v);var r=new uint[u.Length];for(int i=0;i<u.Length;i++)r[i]=(uint)u[i].Value;return r;}[MethodImpl(256)]public static long[]Calc<TMod>(ReadOnlySpan<long>a,ReadOnlySpan<long>b)where TMod:struct,IStaticMod{var u=new StaticModInt<TMod>[a.Length];for(int i=0;i<a.Length;i++)u[i]=a[i];var v=new StaticModInt<TMod>[b.Length];for(int i=0;i<b.Length;i++)v[i]=b[i];u=Calc<TMod>(u,v);var r=new long[u.Length];for(int i=0;i<u.Length;i++)r[i]=u[i];return r;}[MethodImpl(256)]public static StaticModInt<TMod>[]Calc<TMod>(ReadOnlySpan<StaticModInt<TMod>>a,ReadOnlySpan<StaticModInt<TMod>>b)where TMod:struct,IStaticMod{var n=a.Length;var m=b.Length;if(n==0||m==0)return Array.Empty<StaticModInt<TMod>>();if(Math.Min(n,m)<=30)return Naive(a,b);return FFT(a,b);}[MethodImpl(256)]public static StaticModInt<TMod>[]Calc<TMod>(StaticModInt<TMod>[]a,StaticModInt<TMod>[]b)where TMod:struct,IStaticMod=>Calc((ReadOnlySpan<StaticModInt<TMod>>)a,b);[MethodImpl(256)]public static StaticModInt<TMod>[]Square<TMod>(ReadOnlySpan<StaticModInt<TMod>>a)where TMod:struct,IStaticMod{var n=a.Length;if(n==0)return Array.Empty<StaticModInt<TMod>>();if(n<=30)return Naive(a,a);return SquareFFT(a);}[MethodImpl(256)]private static StaticModInt<TMod>[]SquareFFT<TMod>(ReadOnlySpan<StaticModInt<TMod>>a)where TMod:struct,IStaticMod{int n=a.Length;int len=2*n-1;int z=1<<InternalBit.CeilPow2(len);var a2=new StaticModInt<TMod>[z];a.CopyTo(a2);Butterfly<TMod>.Calculate(a2);for(int i=0;i<a2.Length;i++)a2[i]*=a2[i];Butterfly<TMod>.CalculateInv(a2);var r=a2[..len];var iz=new StaticModInt<TMod>(z).Inv();foreach(ref var x in r.AsSpan())x*=iz;return r;}[MethodImpl(256)]private static StaticModInt<TMod>[]FFT<TMod>(ReadOnlySpan<StaticModInt<TMod>>a,ReadOnlySpan<StaticModInt<TMod>>b)where TMod:struct,IStaticMod{int n=a.Length,m=b.Length;int len=n+m-1;int z=1<<InternalBit.CeilPow2(len);var a2=new StaticModInt<TMod>[z];var b2=new StaticModInt<TMod>[z];a.CopyTo(a2);b.CopyTo(b2);Butterfly<TMod>.Calculate(a2);Butterfly<TMod>.Calculate(b2);for(int i=0;i<a2.Length;i++)a2[i]*=b2[i];Butterfly<TMod>.CalculateInv(a2);var r=a2[..len];var iz=new StaticModInt<TMod>(z).Inv();foreach(ref var x in r.AsSpan())x*=iz;return r;}[MethodImpl(256)]private static StaticModInt<TMod>[]Naive<TMod>(ReadOnlySpan<StaticModInt<TMod>>a,ReadOnlySpan<StaticModInt<TMod>>b)where TMod:struct,IStaticMod{if(a.Length<b.Length){var temp=a;a=b;b=temp;}var ans=new StaticModInt<TMod>[a.Length+b.Length-1];for(int i=0;i<a.Length;i++)for(int j=0;j<b.Length;j++)ans[i+j]+=a[i]*b[j];return ans;}[MethodImpl(256)]public static long[]Long(ReadOnlySpan<long>a,ReadOnlySpan<long>b){unchecked{var n=a.Length;var m=b.Length;if(n==0||m==0){return Array.Empty<long>();}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<FFTMod1>(a,b);var c2=Calc<FFTMod2>(a,b);var c3=Calc<FFTMod3>(a,b);var c=new long[n+m-1];for(int i=0;i<c.Length;i++){ulong x=0;x+=((ulong)c1[i]*i1)%Mod1*M2M3;x+=((ulong)c2[i]*i2)%Mod2*M1M3;x+=((ulong)c3[i]*i3)%Mod3*M1M2;long diff=c1[i]-InternalMath.SafeMod((long)x,(long)Mod1);if(diff<0)diff+=(long)Mod1;switch(diff%5){case 2:x-=M1M2M3;break;case 3:x-=2*M1M2M3;break;case 4:x-=3*M1M2M3;break;}c[i]=(long)x;}return c;}}[MethodImpl(256)]public static StaticModInt<Mod>[]IntMod<Mod>(ReadOnlySpan<StaticModInt<Mod>>a,ReadOnlySpan<StaticModInt<Mod>>b)where Mod:struct,IStaticMod{var n=a.Length;var m=b.Length;if(n==0||m==0)return Array.Empty<StaticModInt<Mod>>();const long Mod1=754974721;const long Mod2=167772161;const long Mod3=469762049;const long M1invM2=95869806;const long M12invM3=187290749;int mod=StaticModInt<Mod>.Mod;long M12mod=Mod1*Mod2%mod;var u=new long[n];for(int i=0;i<n;i++)u[i]=a[i];var v=new long[m];for(int i=0;i<m;i++)v[i]=b[i];var c1=Calc<FFTMod1>(u,v);var c2=Calc<FFTMod2>(u,v);var c3=Calc<FFTMod3>(u,v);var c=new StaticModInt<Mod>[n+m-1];for(int i=0;i<c.Length;i++){long v1=(c2[i]-c1[i])*M1invM2%Mod2;if(v1<0)v1+=Mod2;long v2=(c3[i]-(c1[i]+Mod1*v1)%Mod3)*M12invM3%Mod3;if(v2<0)v2+=Mod3;long v3=(c1[i]+Mod1*v1+M12mod*v2)%mod;if(v3<0)v3+=mod;c[i]=v3;}return c;}private readonly struct FFTMod1:IStaticMod{public uint Mod=>754974721;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 ACLButterfly<Mod>where Mod:struct,IStaticMod{public static uint mod{get;private set;}static uint g;static int rank2;static StaticModInt<Mod>[]root,iroot;static StaticModInt<Mod>[]rate2,irate2;static StaticModInt<Mod>[]rate3,irate3;readonly static bool Initialized=Init();static uint[]buf;static bool Init(){buf=new uint[Vector<uint>.Count];mod=default(Mod).Mod;g=(uint)InternalMath.PrimitiveRoot<Mod>();rank2=BitOperations.TrailingZeroCount(mod-1);root=new StaticModInt<Mod>[rank2+1];iroot=new StaticModInt<Mod>[rank2+1];rate2=new StaticModInt<Mod>[Math.Max(0,rank2-2+1)];irate2=new StaticModInt<Mod>[Math.Max(0,rank2-2+1)];rate3=new StaticModInt<Mod>[Math.Max(0,rank2-3+1)];irate3=new StaticModInt<Mod>[Math.Max(0,rank2-3+1)];root[rank2]=new StaticModInt<Mod>(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<StaticModInt<Mod>>a){int n=a.Length;int h=BitOperations.TrailingZeroCount(n);var regLength=Vector<uint>.Count;var modV=new Vector<uint>(mod);int len=0;while(len<h){if(h-len==1){int p=1<<(h-len-1);StaticModInt<Mod>rot=1;if(p<regLength){for(int s=0;s<(1<<len);s++){int offset=s<<(h-len);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);for(int i=0;i<p;i++){var a0=f0[i];var a1=f1[i]*rot;f0[i]=a0+a1;f1[i]=a0-a1;}if(s+1!=(1<<len))rot*=rate2[BitOperations.TrailingZeroCount(~s)];}}else{for(int s=0;s<(1<<len);s++){int offset=s<<(h-len);var f0=a.Slice(offset,p);var f1=a.Slice(offset+p,p);foreach(ref var x in f1)x*=rot;for(int i=0;i<f0.Length;i+=regLength){var g0=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f1.Slice(i));var v0=new Vector<uint>(g0);var v1=new Vector<uint>(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<<len))rot*=rate2[BitOperations.TrailingZeroCount(~s)];}}len++;}else{int p=1<<(h-len-2);StaticModInt<Mod>rot=1,imag=root[2];if(p<regLength){for(int s=0;s<(1<<len);s++){StaticModInt<Mod>rot2=rot*rot;StaticModInt<Mod>rot3=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;i<p;i++){ulong mod2=(ulong)mod*mod;ulong a0=f0[i];ulong a1=f1[i]*rot;ulong a2=f2[i]*rot2;ulong a3=f3[i]*rot3;ulong a1na3imag=(a1+mod2-a3)%mod*imag;ulong na2=mod2-a2;f0[i]=a0+a2+a1+a3;f1[i]=a0+a2+(2*mod2-(a1+a3));f2[i]=a0+na2+a1na3imag;f3[i]=a0+na2+(mod2-a1na3imag);}if(s+1!=(1<<len))rot*=rate3[BitOperations.TrailingZeroCount(~s)];}}else{for(int s=0;s<(1<<len);s++){StaticModInt<Mod>rot2=rot*rot;StaticModInt<Mod>rot3=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<f0.Length;i+=regLength){var g0=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f1.Slice(i));var g2=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f2.Slice(i));var g3=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f3.Slice(i));var v0=new Vector<uint>(g0);var v1=new Vector<uint>(g1);var v2=new Vector<uint>(g2);var v3=new Vector<uint>(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<uint>(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<<len))rot*=rate3[BitOperations.TrailingZeroCount(~s)];}}len+=2;}}}[MethodImpl(256)]public static void CalculateInv(Span<StaticModInt<Mod>>a){int n=a.Length;var regLength=Vector<uint>.Count;var modV=new Vector<uint>(mod);int h=BitOperations.TrailingZeroCount(n);int len=h;while(len>0){if(len==1){int p=1<<(h-len);StaticModInt<Mod>irot=1;if(p<regLength){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<p;i++){StaticModInt<Mod>a0=f0[i];StaticModInt<Mod>a1=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<f0.Length;i+=regLength){var g0=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f1.Slice(i));var v0=new Vector<uint>(g0);var v1=new Vector<uint>(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);StaticModInt<Mod>irot=1,iimag=iroot[2];if(p<regLength){for(int s=0;s<(1<<(len-2));s++){StaticModInt<Mod>irot2=irot*irot;StaticModInt<Mod>irot3=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<p;i++){ulong a0=f0[i];ulong a1=f1[i];ulong a2=f2[i];ulong a3=f3[i];ulong a2na3iimag=(mod+a2-a3)*iimag;f0[i]=a0+a1+a2+a3;f1[i]=(a0+(mod-a1)+a2na3iimag)*irot;f2[i]=(a0+a1+(mod-a2)+(mod-a3))*irot2;f3[i]=(a0+(mod-a1)+(mod-a2na3iimag))*irot3;}if(s+1!=(1<<(len-2)))irot*=irate3[BitOperations.TrailingZeroCount(~s)];}}else{for(int s=0;s<(1<<(len-2));s++){StaticModInt<Mod>irot2=irot*irot;StaticModInt<Mod>irot3=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<f0.Length;i+=regLength){var g0=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f0.Slice(i));var g1=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f1.Slice(i));var g2=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f2.Slice(i));var g3=MemoryMarshal.Cast<StaticModInt<Mod>,uint>(f3.Slice(i));var v0=new Vector<uint>(g0);var v1=new Vector<uint>(g1);var v2=new Vector<uint>(g2);var v3=new Vector<uint>(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<uint>(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 Butterfly<T>where T:struct,IStaticMod{static readonly List<int[]>bit_reversal=new List<int[]>();public static ReadOnlySpan<int>GetBitReversalArray(int log){for(int l=bit_reversal.Count;l<=log;l++){var rev=new int[1<<l];for(int i=0;i<rev.Length;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));bit_reversal.Add(rev);}return bit_reversal[log];}public static StaticModInt<T>GetRoot(int log){int g=InternalMath.PrimitiveRoot<T>();var z=new StaticModInt<T>(g).Pow((default(T).Mod-1)>>log);return z;}public static readonly StaticModInt<T>[]sumE=CalcurateSumE();public static readonly StaticModInt<T>[]sumIE=CalcurateSumIE();public static readonly uint Mod=default(T).Mod;[MethodImpl(256)]public static void Calculate(Span<StaticModInt<T>>a){var n=a.Length;var h=InternalBit.CeilPow2(n);var regLength=Vector<uint>.Count;var modV=new Vector<uint>(Mod);for(int ph=1;ph<=h;ph++){int w=1<<(ph-1);int p=1<<(h-ph);var now=StaticModInt<T>.Raw(1);for(int s=0;s<w;s++){int offset=s<<(h-ph+1);var ls=a.Slice(offset,p);var rs=a.Slice(offset+p,p);if(p<regLength){for(int i=0;i<p;i++){var l=ls[i];var r=rs[i]*now;ls[i]=l+r;rs[i]=l-r;}}else{foreach(ref var r in rs)r*=now;var lu=MemoryMarshal.Cast<StaticModInt<T>,uint>(ls);var ru=MemoryMarshal.Cast<StaticModInt<T>,uint>(rs);for(int i=0;i<lu.Length;i+=regLength){var luSliced=lu.Slice(i);var ruSliced=ru.Slice(i);var u=new Vector<uint>(luSliced);var v=new Vector<uint>(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<StaticModInt<T>>a){var n=a.Length;var h=InternalBit.CeilPow2(n);var regLength=Vector<uint>.Count;var modV=new Vector<uint>(Mod);for(int ph=h;ph>=1;ph--){int w=1<<(ph-1);int p=1<<(h-ph);var iNow=StaticModInt<T>.Raw(1);for(int s=0;s<w;s++){int offset=s<<(h-ph+1);var ls=a.Slice(offset,p);var rs=a.Slice(offset+p,p);if(p<regLength){for(int i=0;i<p;i++){var l=ls[i];var r=rs[i];ls[i]=l+r;rs[i]=StaticModInt<T>.Raw((int)((ulong)(Mod+l.Value-r.Value)*(ulong)iNow.Value%Mod));}}else{var lu=MemoryMarshal.Cast<StaticModInt<T>,uint>(ls);var ru=MemoryMarshal.Cast<StaticModInt<T>,uint>(rs);for(int i=0;i<lu.Length;i+=regLength){var luSliced=lu.Slice(i);var ruSliced=ru.Slice(i);var u=new Vector<uint>(luSliced);var v=new Vector<uint>(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<T>[]CalcurateSumE(){int g=InternalMath.PrimitiveRoot<T>();int cnt2=InternalBit.Bsf(default(T).Mod-1);var e=new StaticModInt<T>(g).Pow((default(T).Mod-1)>>cnt2);var ie=e.Inv();var sumE=new StaticModInt<T>[30];Span<StaticModInt<T>>es=stackalloc StaticModInt<T>[cnt2-1];Span<StaticModInt<T>>ies=stackalloc StaticModInt<T>[cnt2-1];for(int i=es.Length-1;i>=0;i--){es[i]=e;ies[i]=ie;e*=e;ie*=ie;}var now=StaticModInt<T>.Raw(1);for(int i=0;i<=cnt2-2;i++){sumE[i]=es[i]*now;now*=ies[i];}return sumE;}public static StaticModInt<T>[]CalcurateSumIE(){int g=InternalMath.PrimitiveRoot<T>();int cnt2=InternalBit.Bsf(default(T).Mod-1);var e=new StaticModInt<T>(g).Pow((default(T).Mod-1)>>cnt2);var ie=e.Inv();var sumIE=new StaticModInt<T>[30];Span<StaticModInt<T>>es=stackalloc StaticModInt<T>[cnt2-1];Span<StaticModInt<T>>ies=stackalloc StaticModInt<T>[cnt2-1];for(int i=es.Length-1;i>=0;i--){es[i]=e;ies[i]=ie;e*=e;ie*=ie;}var now=StaticModInt<T>.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<StaticModInt<T>>a,Span<StaticModInt<T>>b){int n=a.Length;var c=b[n..];a.CopyTo(b);a.CopyTo(c);CalculateInv(c);int g=InternalMath.PrimitiveRoot<T>();var z=new StaticModInt<T>(g).Pow((default(T).Mod-1)/(2*n));StaticModInt<T>w=1;for(int i=0;i<c.Length;i++,w*=z)c[i]*=w;Calculate(c);foreach(ref var v in b[..n])v*=n;}}}
namespace Lib{public static class InternalMath{private static readonly Dictionary<uint,int>primitiveRootsCache=new Dictionary<uint,int>(){{2,1},{167772161,3},{469762049,3},{754974721,11},{998244353,3}};[MethodImpl(256)]public static int PrimitiveRoot<TMod>()where TMod:struct,IStaticMod{uint m=default(TMod).Mod;if(primitiveRootsCache.TryGetValue(m,out var p))return p;return primitiveRootsCache[m]=PrimitiveRootCalculate<TMod>();}static int PrimitiveRootCalculate<TMod>()where TMod:struct,IStaticMod{var m=default(TMod).Mod;Span<uint>divs=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<TMod>(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){Span<uint>divs=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;ReadOnlySpan<byte>bases=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<m)return ans;(n,m,a,b)=(yMax/m,a,m,yMax%m);}}[MethodImpl(256)]public static ulong Mul128Bit(ulong a,ulong b){if(System.Runtime.Intrinsics.X86.Bmi2.X64.IsSupported)return System.Runtime.Intrinsics.X86.Bmi2.X64.MultiplyNoFlags(a,b);return Mul128BitLogic(a,b);}[MethodImpl(256)]internal static ulong Mul128BitLogic(ulong a,ulong b){var au=a>>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 ModFact<TMod>where TMod:struct,IStaticMod{static StaticModInt<TMod>[]fact;static StaticModInt<TMod>[]factinv;static StaticModInt<TMod>[]inv;public ModFact(long n){if(fact==null){fact=new StaticModInt<TMod>[n+1];factinv=new StaticModInt<TMod>[n+1];inv=new StaticModInt<TMod>[n+1];fact[0]=1;for(long i=0;i<n;i++)fact[i+1]=fact[i]*(i+1);factinv[n]=fact[n].Inv();for(long i=n;i>0;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;i<n;i++)fact[i+1]=fact[i]*(i+1);factinv[n]=fact[n].Inv();for(long i=n;i>m;i--)factinv[i-1]=factinv[i]*i;for(long i=m;i<=n;i++)inv[i]=fact[i-1]*factinv[i];}[MethodImpl(256)]public StaticModInt<TMod>Fact(long n){if(fact.Length<=n)Resize(n);return fact[n];}[MethodImpl(256)]public StaticModInt<TMod>FactInv(long n){if(fact.Length<=n)Resize(n);return factinv[n];}[MethodImpl(256)]public StaticModInt<TMod>Inv(long n){if(n==0)throw new DivideByZeroException();if(fact.Length<=n)Resize(n);return inv[n];}[MethodImpl(256)]public StaticModInt<TMod>Binom(long n,long k){if(n<0)return 0;if(n==0)return k==0?1:0;if(k<0||n<k)return 0;if(fact.Length<=n)Resize(n);return fact[n]*factinv[k]*factinv[n-k];}[MethodImpl(256)]public StaticModInt<TMod>BinomInv(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 StaticModInt<TMod>Multinom(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 StaticModInt<TMod>Multinom(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);StaticModInt<TMod>ret=fact[n]*factinv[k0];for(int i=0;i<ks.Length;i++){long k=ks[i];if(k<0||k>n)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<T>:IEquatable<StaticModInt<T>>,IField<StaticModInt<T>>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 StaticModInt<T>Zero=>default;public static StaticModInt<T>One=>new StaticModInt<T>(1u);[MethodImpl(256)]public static StaticModInt<T>Raw(int v){var u=unchecked((uint)v);return new StaticModInt<T>(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(StaticModInt<T>x)=>x.Value==0;public static bool IsOne(StaticModInt<T>x)=>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 StaticModInt<T>operator ++(StaticModInt<T>v){var x=v._v+1;if(x==op.Mod)x=0;return new StaticModInt<T>(x);}[MethodImpl(256)]public static StaticModInt<T>operator --(StaticModInt<T>v){var x=v._v;if(x==0)x=op.Mod;return new StaticModInt<T>(x-1);}[MethodImpl(256)]public static StaticModInt<T>operator+(StaticModInt<T>lhs,StaticModInt<T>rhs){var v=lhs._v+rhs._v;if(v>=op.Mod)v-=op.Mod;return new StaticModInt<T>(v);}[MethodImpl(256)]public static StaticModInt<T>operator-(StaticModInt<T>lhs,StaticModInt<T>rhs){unchecked{var v=lhs._v-rhs._v;if(v>=op.Mod)v+=op.Mod;return new StaticModInt<T>(v);}}[MethodImpl(256)]public static StaticModInt<T>operator*(StaticModInt<T>lhs,StaticModInt<T>rhs)=>new StaticModInt<T>((uint)((ulong)lhs._v*rhs._v%op.Mod));[MethodImpl(256)]public static StaticModInt<T>operator/(StaticModInt<T>lhs,StaticModInt<T>rhs)=>new StaticModInt<T>((uint)((ulong)lhs._v*Inv(rhs._v)%op.Mod));[MethodImpl(256)]public static StaticModInt<T>operator+(StaticModInt<T>v)=>v;[MethodImpl(256)]public static StaticModInt<T>operator-(StaticModInt<T>v)=>new StaticModInt<T>(v._v==0?0:op.Mod-v._v);[MethodImpl(256)]public static bool operator==(StaticModInt<T>lhs,StaticModInt<T>rhs)=>lhs._v==rhs._v;[MethodImpl(256)]public static bool operator!=(StaticModInt<T>lhs,StaticModInt<T>rhs)=>lhs._v!=rhs._v;[MethodImpl(256)]public static implicit operator StaticModInt<T>(int v)=>new StaticModInt<T>(v);[MethodImpl(256)]public static implicit operator StaticModInt<T>(uint v)=>new StaticModInt<T>((long)v);[MethodImpl(256)]public static implicit operator StaticModInt<T>(long v)=>new StaticModInt<T>(v);[MethodImpl(256)]public static implicit operator StaticModInt<T>(ulong v)=>new StaticModInt<T>(v);[MethodImpl(256)]public static implicit operator long(StaticModInt<T>v)=>v._v;[MethodImpl(256)]public static implicit operator ulong(StaticModInt<T>v)=>v._v;[MethodImpl(256)]public StaticModInt<T>Pow(long n){var x=this;var r=new StaticModInt<T>(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 StaticModInt<T>Inv()=>new StaticModInt<T>(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 StaticModInt<T>m&&Equals(m);[MethodImpl(256)]public bool Equals(StaticModInt<T>other)=>_v==other._v;[MethodImpl(256)]public override int GetHashCode()=>_v.GetHashCode();}}
namespace Lib{public static class OutputLib{[MethodImpl(256)]public static void WriteJoin<T>(string s,IEnumerable<T>t)=>Console.WriteLine(string.Join(s,t));[MethodImpl(256)]public static void WriteMat<T>(T[,]a,string sep=" "){int sz1=a.GetLength(0),sz2=a.GetLength(1);var b=new T[sz2];for(int i=0;i<sz1;i++){for(int j=0;j<sz2;j++)b[j]=a[i,j];WriteJoin(sep,b);}}[MethodImpl(256)]public static void WriteMat<T>(T[][]a,string sep=" "){foreach(var ar in a)WriteJoin(sep,ar);}[MethodImpl(256)]public static void WriteMat<T>(T[][]a,Func<T,string>map,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
0