; LLVM IR from abeaumont/competitive-programming :: codechef/oct19a (jiit)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.std::basic_istream" = type { ptr, i64, %"class.std::basic_ios" }
%"class.std::basic_ios" = type { %"class.std::ios_base", ptr, i8, i8, ptr, ptr, ptr, ptr }
%"class.std::ios_base" = type { ptr, i64, i64, i32, i32, i32, ptr, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, ptr, %"class.std::locale" }
%"struct.std::ios_base::_Words" = type { ptr, i64 }
%"class.std::locale" = type { ptr }
%"class.std::basic_ostream" = type { ptr, %"class.std::basic_ios" }

@binom = external dso_local global [2001 x [2001 x i64]], align 16
@pow2 = external dso_local global [2001 x i64], align 16
@invpow2 = external dso_local global [2001 x i64], align 16
@powq = external dso_local global [4002 x i64], align 16
@aa = external dso_local global [2 x [2001 x [2001 x i32]]], align 16
@_ZSt3cin = external global %"class.std::basic_istream", align 8
@_ZSt4cout = external global %"class.std::basic_ostream", align 8
@.str = external hidden unnamed_addr constant [3 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [2 x i8], align 1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_Z6modinvxx(i64 noundef, i64 noundef) #0

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_Z3powxxi(i64 noundef, i64 noundef, i32 noundef) #0

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_Z1fxxxx(i64 noundef, i64 noundef, i64 noundef, i64 noundef) #0

; Function Attrs: mustprogress norecurse uwtable
define dso_local noundef i32 @main() #2 {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  %6 = alloca i32, align 4
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca i64, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca i64, align 8
  %18 = alloca i64, align 8
  %19 = alloca i64, align 8
  %20 = alloca i64, align 8
  %21 = alloca i64, align 8
  %22 = alloca i64, align 8
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i64, align 8
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i64, align 8
  store i32 0, ptr %1, align 4
  %33 = call noundef zeroext i1 @_ZNSt8ios_base15sync_with_stdioEb(i1 noundef zeroext false)
  %34 = load ptr, ptr @_ZSt3cin, align 8, !tbaa !5
  %35 = getelementptr i8, ptr %34, i64 -24
  %36 = load i64, ptr %35, align 8
  %37 = getelementptr inbounds i8, ptr @_ZSt3cin, i64 %36
  %38 = call noundef ptr @_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo(ptr noundef nonnull align 8 dereferenceable(264) %37, ptr noundef null)
  store i64 1, ptr @pow2, align 16, !tbaa !8
  store i64 1, ptr @invpow2, align 16, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr %2) #7
  store i32 1, ptr %2, align 4, !tbaa !11
  br label %39

39:                                               ; preds = %65, %0
  %40 = load i32, ptr %2, align 4, !tbaa !11
  %41 = icmp sle i32 %40, 2000
  br i1 %41, label %43, label %42

42:                                               ; preds = %39
  call void @llvm.lifetime.end.p0(i64 4, ptr %2) #7
  br label %68

43:                                               ; preds = %39
  %44 = load i32, ptr %2, align 4, !tbaa !11
  %45 = sub nsw i32 %44, 1
  %46 = sext i32 %45 to i64
  %47 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %46
  %48 = load i64, ptr %47, align 8, !tbaa !8
  %49 = mul nsw i64 %48, 2
  %50 = load i32, ptr %2, align 4, !tbaa !11
  %51 = sext i32 %50 to i64
  %52 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %51
  store i64 %49, ptr %52, align 8, !tbaa !8
  %53 = load i32, ptr %2, align 4, !tbaa !11
  %54 = sext i32 %53 to i64
  %55 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %54
  %56 = load i64, ptr %55, align 8, !tbaa !8
  %57 = icmp sge i64 %56, 998244353
  br i1 %57, label %58, label %64

58:                                               ; preds = %43
  %59 = load i32, ptr %2, align 4, !tbaa !11
  %60 = sext i32 %59 to i64
  %61 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %60
  %62 = load i64, ptr %61, align 8, !tbaa !8
  %63 = sub nsw i64 %62, 998244353
  store i64 %63, ptr %61, align 8, !tbaa !8
  br label %64

64:                                               ; preds = %58, %43
  br label %65

65:                                               ; preds = %64
  %66 = load i32, ptr %2, align 4, !tbaa !11
  %67 = add nsw i32 %66, 1
  store i32 %67, ptr %2, align 4, !tbaa !11
  br label %39, !llvm.loop !13

68:                                               ; preds = %42
  call void @llvm.lifetime.start.p0(i64 4, ptr %3) #7
  store i32 1, ptr %3, align 4, !tbaa !11
  br label %69

69:                                               ; preds = %82, %68
  %70 = load i32, ptr %3, align 4, !tbaa !11
  %71 = icmp sle i32 %70, 2000
  br i1 %71, label %73, label %72

72:                                               ; preds = %69
  call void @llvm.lifetime.end.p0(i64 4, ptr %3) #7
  br label %85

73:                                               ; preds = %69
  %74 = load i32, ptr %3, align 4, !tbaa !11
  %75 = sext i32 %74 to i64
  %76 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %75
  %77 = load i64, ptr %76, align 8, !tbaa !8
  %78 = call noundef i64 @_Z6modinvxx(i64 noundef %77, i64 noundef 998244353)
  %79 = load i32, ptr %3, align 4, !tbaa !11
  %80 = sext i32 %79 to i64
  %81 = getelementptr inbounds [2001 x i64], ptr @invpow2, i64 0, i64 %80
  store i64 %78, ptr %81, align 8, !tbaa !8
  br label %82

82:                                               ; preds = %73
  %83 = load i32, ptr %3, align 4, !tbaa !11
  %84 = add nsw i32 %83, 1
  store i32 %84, ptr %3, align 4, !tbaa !11
  br label %69, !llvm.loop !15

85:                                               ; preds = %72
  call void @llvm.lifetime.start.p0(i64 4, ptr %4) #7
  store i32 0, ptr %4, align 4, !tbaa !11
  br label %86

86:                                               ; preds = %153, %85
  %87 = load i32, ptr %4, align 4, !tbaa !11
  %88 = icmp sle i32 %87, 2000
  br i1 %88, label %90, label %89

89:                                               ; preds = %86
  store i32 8, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %4) #7
  br label %156

90:                                               ; preds = %86
  %91 = load i32, ptr %4, align 4, !tbaa !11
  %92 = sext i32 %91 to i64
  %93 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %92
  %94 = load i32, ptr %4, align 4, !tbaa !11
  %95 = sext i32 %94 to i64
  %96 = getelementptr inbounds [2001 x i64], ptr %93, i64 0, i64 %95
  store i64 1, ptr %96, align 8, !tbaa !8
  %97 = load i32, ptr %4, align 4, !tbaa !11
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %98
  %100 = getelementptr inbounds [2001 x i64], ptr %99, i64 0, i64 0
  store i64 1, ptr %100, align 8, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #7
  store i32 1, ptr %6, align 4, !tbaa !11
  br label %101

101:                                              ; preds = %149, %90
  %102 = load i32, ptr %6, align 4, !tbaa !11
  %103 = load i32, ptr %4, align 4, !tbaa !11
  %104 = icmp slt i32 %102, %103
  br i1 %104, label %106, label %105

105:                                              ; preds = %101
  store i32 11, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #7
  br label %152

106:                                              ; preds = %101
  %107 = load i32, ptr %4, align 4, !tbaa !11
  %108 = sub nsw i32 %107, 1
  %109 = sext i32 %108 to i64
  %110 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %109
  %111 = load i32, ptr %6, align 4, !tbaa !11
  %112 = sub nsw i32 %111, 1
  %113 = sext i32 %112 to i64
  %114 = getelementptr inbounds [2001 x i64], ptr %110, i64 0, i64 %113
  %115 = load i64, ptr %114, align 8, !tbaa !8
  %116 = load i32, ptr %4, align 4, !tbaa !11
  %117 = sub nsw i32 %116, 1
  %118 = sext i32 %117 to i64
  %119 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %118
  %120 = load i32, ptr %6, align 4, !tbaa !11
  %121 = sext i32 %120 to i64
  %122 = getelementptr inbounds [2001 x i64], ptr %119, i64 0, i64 %121
  %123 = load i64, ptr %122, align 8, !tbaa !8
  %124 = add nsw i64 %115, %123
  %125 = load i32, ptr %4, align 4, !tbaa !11
  %126 = sext i32 %125 to i64
  %127 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %126
  %128 = load i32, ptr %6, align 4, !tbaa !11
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds [2001 x i64], ptr %127, i64 0, i64 %129
  store i64 %124, ptr %130, align 8, !tbaa !8
  %131 = load i32, ptr %4, align 4, !tbaa !11
  %132 = sext i32 %131 to i64
  %133 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %132
  %134 = load i32, ptr %6, align 4, !tbaa !11
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds [2001 x i64], ptr %133, i64 0, i64 %135
  %137 = load i64, ptr %136, align 8, !tbaa !8
  %138 = icmp sge i64 %137, 998244353
  br i1 %138, label %139, label %148

139:                                              ; preds = %106
  %140 = load i32, ptr %4, align 4, !tbaa !11
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %141
  %143 = load i32, ptr %6, align 4, !tbaa !11
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds [2001 x i64], ptr %142, i64 0, i64 %144
  %146 = load i64, ptr %145, align 8, !tbaa !8
  %147 = sub nsw i64 %146, 998244353
  store i64 %147, ptr %145, align 8, !tbaa !8
  br label %148

148:                                              ; preds = %139, %106
  br label %149

149:                                              ; preds = %148
  %150 = load i32, ptr %6, align 4, !tbaa !11
  %151 = add nsw i32 %150, 1
  store i32 %151, ptr %6, align 4, !tbaa !11
  br label %101, !llvm.loop !16

152:                                              ; preds = %105
  br label %153

153:                                              ; preds = %152
  %154 = load i32, ptr %4, align 4, !tbaa !11
  %155 = add nsw i32 %154, 1
  store i32 %155, ptr %4, align 4, !tbaa !11
  br label %86, !llvm.loop !17

156:                                              ; preds = %89
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #7
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  %157 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) @_ZSt3cin, ptr noundef nonnull align 8 dereferenceable(8) %7)
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  store i64 0, ptr %12, align 8, !tbaa !8
  br label %158

158:                                              ; preds = %644, %156
  %159 = load i64, ptr %12, align 8, !tbaa !8
  %160 = load i64, ptr %7, align 8, !tbaa !8
  %161 = icmp slt i64 %159, %160
  br i1 %161, label %163, label %162

162:                                              ; preds = %158
  store i32 14, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  br label %647

163:                                              ; preds = %158
  %164 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) @_ZSt3cin, ptr noundef nonnull align 8 dereferenceable(8) %8)
  %165 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %164, ptr noundef nonnull align 8 dereferenceable(8) %9)
  %166 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %165, ptr noundef nonnull align 8 dereferenceable(8) %10)
  %167 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %166, ptr noundef nonnull align 8 dereferenceable(8) %11)
  %168 = load i64, ptr %8, align 8, !tbaa !8
  %169 = srem i64 %168, 2
  %170 = load i64, ptr %9, align 8, !tbaa !8
  %171 = srem i64 %170, 2
  %172 = icmp eq i64 %169, %171
  br i1 %172, label %173, label %198

173:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #7
  %174 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIxERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %9, ptr noundef nonnull align 8 dereferenceable(8) %8)
  %175 = load i64, ptr %174, align 8, !tbaa !8
  %176 = trunc i64 %175 to i32
  store i32 %176, ptr %13, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %177 = load i32, ptr %13, align 4, !tbaa !11
  %178 = sub nsw i32 0, %177
  store i32 %178, ptr %14, align 4, !tbaa !11
  br label %179

179:                                              ; preds = %194, %173
  %180 = load i32, ptr %14, align 4, !tbaa !11
  %181 = load i32, ptr %13, align 4, !tbaa !11
  %182 = icmp sle i32 %180, %181
  br i1 %182, label %184, label %183

183:                                              ; preds = %179
  store i32 17, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  br label %197

184:                                              ; preds = %179
  %185 = load i32, ptr %14, align 4, !tbaa !11
  %186 = sext i32 %185 to i64
  %187 = load i64, ptr %10, align 8, !tbaa !8
  %188 = call noundef i32 @_Z3powxxi(i64 noundef %186, i64 noundef %187, i32 noundef 998244353)
  %189 = sext i32 %188 to i64
  %190 = load i32, ptr %14, align 4, !tbaa !11
  %191 = add nsw i32 2000, %190
  %192 = sext i32 %191 to i64
  %193 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %192
  store i64 %189, ptr %193, align 8, !tbaa !8
  br label %194

194:                                              ; preds = %184
  %195 = load i32, ptr %14, align 4, !tbaa !11
  %196 = add nsw i32 %195, 2
  store i32 %196, ptr %14, align 4, !tbaa !11
  br label %179, !llvm.loop !18

197:                                              ; preds = %183
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #7
  br label %245

198:                                              ; preds = %163
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #7
  %199 = load i64, ptr %8, align 8, !tbaa !8
  %200 = sub nsw i64 0, %199
  %201 = trunc i64 %200 to i32
  store i32 %201, ptr %15, align 4, !tbaa !11
  br label %202

202:                                              ; preds = %218, %198
  %203 = load i32, ptr %15, align 4, !tbaa !11
  %204 = sext i32 %203 to i64
  %205 = load i64, ptr %8, align 8, !tbaa !8
  %206 = icmp sle i64 %204, %205
  br i1 %206, label %208, label %207

207:                                              ; preds = %202
  store i32 20, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #7
  br label %221

208:                                              ; preds = %202
  %209 = load i32, ptr %15, align 4, !tbaa !11
  %210 = sext i32 %209 to i64
  %211 = load i64, ptr %10, align 8, !tbaa !8
  %212 = call noundef i32 @_Z3powxxi(i64 noundef %210, i64 noundef %211, i32 noundef 998244353)
  %213 = sext i32 %212 to i64
  %214 = load i32, ptr %15, align 4, !tbaa !11
  %215 = add nsw i32 2000, %214
  %216 = sext i32 %215 to i64
  %217 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %216
  store i64 %213, ptr %217, align 8, !tbaa !8
  br label %218

218:                                              ; preds = %208
  %219 = load i32, ptr %15, align 4, !tbaa !11
  %220 = add nsw i32 %219, 2
  store i32 %220, ptr %15, align 4, !tbaa !11
  br label %202, !llvm.loop !19

221:                                              ; preds = %207
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  %222 = load i64, ptr %9, align 8, !tbaa !8
  %223 = sub nsw i64 0, %222
  %224 = trunc i64 %223 to i32
  store i32 %224, ptr %16, align 4, !tbaa !11
  br label %225

225:                                              ; preds = %241, %221
  %226 = load i32, ptr %16, align 4, !tbaa !11
  %227 = sext i32 %226 to i64
  %228 = load i64, ptr %9, align 8, !tbaa !8
  %229 = icmp sle i64 %227, %228
  br i1 %229, label %231, label %230

230:                                              ; preds = %225
  store i32 23, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  br label %244

231:                                              ; preds = %225
  %232 = load i32, ptr %16, align 4, !tbaa !11
  %233 = sext i32 %232 to i64
  %234 = load i64, ptr %10, align 8, !tbaa !8
  %235 = call noundef i32 @_Z3powxxi(i64 noundef %233, i64 noundef %234, i32 noundef 998244353)
  %236 = sext i32 %235 to i64
  %237 = load i32, ptr %16, align 4, !tbaa !11
  %238 = add nsw i32 2000, %237
  %239 = sext i32 %238 to i64
  %240 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %239
  store i64 %236, ptr %240, align 8, !tbaa !8
  br label %241

241:                                              ; preds = %231
  %242 = load i32, ptr %16, align 4, !tbaa !11
  %243 = add nsw i32 %242, 2
  store i32 %243, ptr %16, align 4, !tbaa !11
  br label %225, !llvm.loop !20

244:                                              ; preds = %230
  br label %245

245:                                              ; preds = %244, %197
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #7
  %246 = load i64, ptr %8, align 8, !tbaa !8
  %247 = add nsw i64 %246, 1
  store i64 %247, ptr %17, align 8, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #7
  %248 = load i64, ptr %9, align 8, !tbaa !8
  %249 = add nsw i64 %248, 1
  store i64 %249, ptr %18, align 8, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  store i64 0, ptr %19, align 8, !tbaa !8
  br label %250

250:                                              ; preds = %317, %245
  %251 = load i64, ptr %19, align 8, !tbaa !8
  %252 = load i64, ptr %8, align 8, !tbaa !8
  %253 = icmp sle i64 %251, %252
  br i1 %253, label %255, label %254

254:                                              ; preds = %250
  store i32 26, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  br label %320

255:                                              ; preds = %250
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  %256 = load i64, ptr %11, align 8, !tbaa !8
  %257 = load i64, ptr %19, align 8, !tbaa !8
  %258 = load i64, ptr %9, align 8, !tbaa !8
  %259 = mul nsw i64 %257, %258
  %260 = sub nsw i64 %256, %259
  store i64 %260, ptr %20, align 8, !tbaa !8
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #7
  %261 = load i64, ptr %8, align 8, !tbaa !8
  %262 = load i64, ptr %19, align 8, !tbaa !8
  %263 = mul nsw i64 2, %262
  %264 = sub nsw i64 %261, %263
  store i64 %264, ptr %21, align 8, !tbaa !8
  %265 = load i64, ptr %21, align 8, !tbaa !8
  %266 = icmp ne i64 %265, 0
  br i1 %266, label %280, label %267

267:                                              ; preds = %255
  %268 = load i64, ptr %9, align 8, !tbaa !8
  %269 = load i64, ptr %19, align 8, !tbaa !8
  %270 = mul nsw i64 %268, %269
  %271 = load i64, ptr %11, align 8, !tbaa !8
  %272 = icmp eq i64 %270, %271
  br i1 %272, label %273, label %280

273:                                              ; preds = %267
  %274 = load i64, ptr %17, align 8, !tbaa !8
  %275 = load i64, ptr %19, align 8, !tbaa !8
  %276 = icmp sgt i64 %274, %275
  br i1 %276, label %277, label %279

277:                                              ; preds = %273
  %278 = load i64, ptr %19, align 8, !tbaa !8
  store i64 %278, ptr %17, align 8, !tbaa !8
  br label %279

279:                                              ; preds = %277, %273
  store i64 0, ptr %18, align 8, !tbaa !8
  store i32 28, ptr %5, align 4
  br label %314

280:                                              ; preds = %267, %255
  %281 = load i64, ptr %21, align 8, !tbaa !8
  %282 = icmp ne i64 %281, 0
  br i1 %282, label %283, label %288

283:                                              ; preds = %280
  %284 = load i64, ptr %20, align 8, !tbaa !8
  %285 = load i64, ptr %21, align 8, !tbaa !8
  %286 = srem i64 %284, %285
  %287 = icmp ne i64 %286, 0
  br i1 %287, label %288, label %289

288:                                              ; preds = %283, %280
  store i32 28, ptr %5, align 4
  br label %314

289:                                              ; preds = %283
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #7
  %290 = load i64, ptr %20, align 8, !tbaa !8
  %291 = load i64, ptr %21, align 8, !tbaa !8
  %292 = sdiv i64 %290, %291
  store i64 %292, ptr %22, align 8, !tbaa !8
  %293 = load i64, ptr %22, align 8, !tbaa !8
  %294 = icmp slt i64 %293, 0
  br i1 %294, label %299, label %295

295:                                              ; preds = %289
  %296 = load i64, ptr %22, align 8, !tbaa !8
  %297 = load i64, ptr %9, align 8, !tbaa !8
  %298 = icmp sgt i64 %296, %297
  br i1 %298, label %299, label %300

299:                                              ; preds = %295, %289
  store i32 28, ptr %5, align 4
  br label %313

300:                                              ; preds = %295
  %301 = load i64, ptr %17, align 8, !tbaa !8
  %302 = load i64, ptr %19, align 8, !tbaa !8
  %303 = icmp sgt i64 %301, %302
  br i1 %303, label %304, label %306

304:                                              ; preds = %300
  %305 = load i64, ptr %19, align 8, !tbaa !8
  store i64 %305, ptr %17, align 8, !tbaa !8
  br label %306

306:                                              ; preds = %304, %300
  %307 = load i64, ptr %18, align 8, !tbaa !8
  %308 = load i64, ptr %22, align 8, !tbaa !8
  %309 = icmp sgt i64 %307, %308
  br i1 %309, label %310, label %312

310:                                              ; preds = %306
  %311 = load i64, ptr %22, align 8, !tbaa !8
  store i64 %311, ptr %18, align 8, !tbaa !8
  br label %312

312:                                              ; preds = %310, %306
  store i32 0, ptr %5, align 4
  br label %313

313:                                              ; preds = %312, %299
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #7
  br label %314

314:                                              ; preds = %313, %288, %279
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  %315 = load i32, ptr %5, align 4
  switch i32 %315, label %649 [
    i32 0, label %316
    i32 28, label %317
  ]

316:                                              ; preds = %314
  br label %317

317:                                              ; preds = %316, %314
  %318 = load i64, ptr %19, align 8, !tbaa !8
  %319 = add nsw i64 %318, 1
  store i64 %319, ptr %19, align 8, !tbaa !8
  br label %250, !llvm.loop !21

320:                                              ; preds = %254
  %321 = load i64, ptr %17, align 8, !tbaa !8
  %322 = load i64, ptr %8, align 8, !tbaa !8
  %323 = icmp sgt i64 %321, %322
  br i1 %323, label %328, label %324

324:                                              ; preds = %320
  %325 = load i64, ptr %18, align 8, !tbaa !8
  %326 = load i64, ptr %9, align 8, !tbaa !8
  %327 = icmp sgt i64 %325, %326
  br i1 %327, label %328, label %330

328:                                              ; preds = %324, %320
  %329 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef @.str)
  store i32 16, ptr %5, align 4
  br label %641

330:                                              ; preds = %324
  %331 = load i64, ptr %8, align 8, !tbaa !8
  %332 = load i64, ptr %9, align 8, !tbaa !8
  %333 = icmp eq i64 %331, %332
  br i1 %333, label %334, label %340

334:                                              ; preds = %330
  %335 = load i64, ptr %17, align 8, !tbaa !8
  %336 = load i64, ptr %18, align 8, !tbaa !8
  %337 = icmp sgt i64 %335, %336
  br i1 %337, label %338, label %340

338:                                              ; preds = %334
  %339 = load i64, ptr %18, align 8, !tbaa !8
  store i64 %339, ptr %17, align 8, !tbaa !8
  br label %340

340:                                              ; preds = %338, %334, %330
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  %341 = load i64, ptr %17, align 8, !tbaa !8
  %342 = trunc i64 %341 to i32
  store i32 %342, ptr %23, align 4, !tbaa !11
  br label %343

343:                                              ; preds = %354, %340
  %344 = load i32, ptr %23, align 4, !tbaa !11
  %345 = sext i32 %344 to i64
  %346 = load i64, ptr %8, align 8, !tbaa !8
  %347 = icmp sle i64 %345, %346
  br i1 %347, label %349, label %348

348:                                              ; preds = %343
  store i32 29, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  br label %357

349:                                              ; preds = %343
  %350 = load i32, ptr %23, align 4, !tbaa !11
  %351 = sext i32 %350 to i64
  %352 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %351
  %353 = getelementptr inbounds [2001 x i32], ptr %352, i64 0, i64 0
  store i32 1, ptr %353, align 4, !tbaa !11
  br label %354

354:                                              ; preds = %349
  %355 = load i32, ptr %23, align 4, !tbaa !11
  %356 = add nsw i32 %355, 1
  store i32 %356, ptr %23, align 4, !tbaa !11
  br label %343, !llvm.loop !22

357:                                              ; preds = %348
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #7
  store i32 1, ptr %24, align 4, !tbaa !11
  br label %358

358:                                              ; preds = %406, %357
  %359 = load i32, ptr %24, align 4, !tbaa !11
  %360 = sext i32 %359 to i64
  %361 = load i64, ptr %8, align 8, !tbaa !8
  %362 = icmp sle i64 %360, %361
  br i1 %362, label %364, label %363

363:                                              ; preds = %358
  store i32 32, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #7
  br label %409

364:                                              ; preds = %358
  %365 = load i64, ptr %8, align 8, !tbaa !8
  %366 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %365
  %367 = load i32, ptr %24, align 4, !tbaa !11
  %368 = sext i32 %367 to i64
  %369 = getelementptr inbounds [2001 x i64], ptr %366, i64 0, i64 %368
  %370 = load i64, ptr %369, align 8, !tbaa !8
  %371 = icmp ne i64 %370, 0
  br i1 %371, label %372, label %399

372:                                              ; preds = %364
  %373 = load i32, ptr %24, align 4, !tbaa !11
  %374 = and i32 %373, 1
  %375 = icmp ne i32 %374, 0
  br i1 %375, label %376, label %384

376:                                              ; preds = %372
  %377 = load i64, ptr %8, align 8, !tbaa !8
  %378 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %377
  %379 = load i32, ptr %24, align 4, !tbaa !11
  %380 = sext i32 %379 to i64
  %381 = getelementptr inbounds [2001 x i64], ptr %378, i64 0, i64 %380
  %382 = load i64, ptr %381, align 8, !tbaa !8
  %383 = sub nsw i64 998244353, %382
  br label %391

384:                                              ; preds = %372
  %385 = load i64, ptr %8, align 8, !tbaa !8
  %386 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %385
  %387 = load i32, ptr %24, align 4, !tbaa !11
  %388 = sext i32 %387 to i64
  %389 = getelementptr inbounds [2001 x i64], ptr %386, i64 0, i64 %388
  %390 = load i64, ptr %389, align 8, !tbaa !8
  br label %391

391:                                              ; preds = %384, %376
  %392 = phi i64 [ %383, %376 ], [ %390, %384 ]
  %393 = trunc i64 %392 to i32
  %394 = load i64, ptr %8, align 8, !tbaa !8
  %395 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %394
  %396 = load i32, ptr %24, align 4, !tbaa !11
  %397 = sext i32 %396 to i64
  %398 = getelementptr inbounds [2001 x i32], ptr %395, i64 0, i64 %397
  store i32 %393, ptr %398, align 4, !tbaa !11
  br label %405

399:                                              ; preds = %364
  %400 = load i64, ptr %8, align 8, !tbaa !8
  %401 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %400
  %402 = load i32, ptr %24, align 4, !tbaa !11
  %403 = sext i32 %402 to i64
  %404 = getelementptr inbounds [2001 x i32], ptr %401, i64 0, i64 %403
  store i32 0, ptr %404, align 4, !tbaa !11
  br label %405

405:                                              ; preds = %399, %391
  br label %406

406:                                              ; preds = %405
  %407 = load i32, ptr %24, align 4, !tbaa !11
  %408 = add nsw i32 %407, 1
  store i32 %408, ptr %24, align 4, !tbaa !11
  br label %358, !llvm.loop !23

409:                                              ; preds = %363
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  store i32 1, ptr %25, align 4, !tbaa !11
  br label %410

410:                                              ; preds = %481, %409
  %411 = load i32, ptr %25, align 4, !tbaa !11
  %412 = sext i32 %411 to i64
  %413 = load i64, ptr %8, align 8, !tbaa !8
  %414 = icmp sle i64 %412, %413
  br i1 %414, label %416, label %415

415:                                              ; preds = %410
  store i32 35, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  br label %484

416:                                              ; preds = %410
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  %417 = load i64, ptr %8, align 8, !tbaa !8
  %418 = sub nsw i64 %417, 1
  %419 = trunc i64 %418 to i32
  store i32 %419, ptr %26, align 4, !tbaa !11
  br label %420

420:                                              ; preds = %477, %416
  %421 = load i32, ptr %26, align 4, !tbaa !11
  %422 = sext i32 %421 to i64
  %423 = load i64, ptr %17, align 8, !tbaa !8
  %424 = icmp sge i64 %422, %423
  br i1 %424, label %426, label %425

425:                                              ; preds = %420
  store i32 38, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  br label %480

426:                                              ; preds = %420
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #7
  %427 = load i32, ptr %26, align 4, !tbaa !11
  %428 = add nsw i32 %427, 1
  %429 = sext i32 %428 to i64
  %430 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %429
  %431 = load i32, ptr %25, align 4, !tbaa !11
  %432 = sub nsw i32 %431, 1
  %433 = sext i32 %432 to i64
  %434 = getelementptr inbounds [2001 x i32], ptr %430, i64 0, i64 %433
  %435 = load i32, ptr %434, align 4, !tbaa !11
  %436 = load i32, ptr %26, align 4, !tbaa !11
  %437 = add nsw i32 %436, 1
  %438 = sext i32 %437 to i64
  %439 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %438
  %440 = load i32, ptr %25, align 4, !tbaa !11
  %441 = sext i32 %440 to i64
  %442 = getelementptr inbounds [2001 x i32], ptr %439, i64 0, i64 %441
  %443 = load i32, ptr %442, align 4, !tbaa !11
  %444 = add nsw i32 %435, %443
  %445 = sext i32 %444 to i64
  store i64 %445, ptr %27, align 8, !tbaa !8
  %446 = load i64, ptr %27, align 8, !tbaa !8
  %447 = icmp sge i64 %446, 998244353
  br i1 %447, label %448, label %451

448:                                              ; preds = %426
  %449 = load i64, ptr %27, align 8, !tbaa !8
  %450 = sub nsw i64 %449, 998244353
  store i64 %450, ptr %27, align 8, !tbaa !8
  br label %451

451:                                              ; preds = %448, %426
  %452 = load i32, ptr %26, align 4, !tbaa !11
  %453 = sext i32 %452 to i64
  %454 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %453
  %455 = load i32, ptr %25, align 4, !tbaa !11
  %456 = sub nsw i32 %455, 1
  %457 = sext i32 %456 to i64
  %458 = getelementptr inbounds [2001 x i32], ptr %454, i64 0, i64 %457
  %459 = load i32, ptr %458, align 4, !tbaa !11
  %460 = sext i32 %459 to i64
  %461 = load i64, ptr %27, align 8, !tbaa !8
  %462 = add nsw i64 %461, %460
  store i64 %462, ptr %27, align 8, !tbaa !8
  %463 = load i64, ptr %27, align 8, !tbaa !8
  %464 = icmp sge i64 %463, 998244353
  br i1 %464, label %465, label %468

465:                                              ; preds = %451
  %466 = load i64, ptr %27, align 8, !tbaa !8
  %467 = sub nsw i64 %466, 998244353
  store i64 %467, ptr %27, align 8, !tbaa !8
  br label %468

468:                                              ; preds = %465, %451
  %469 = load i64, ptr %27, align 8, !tbaa !8
  %470 = trunc i64 %469 to i32
  %471 = load i32, ptr %26, align 4, !tbaa !11
  %472 = sext i32 %471 to i64
  %473 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %472
  %474 = load i32, ptr %25, align 4, !tbaa !11
  %475 = sext i32 %474 to i64
  %476 = getelementptr inbounds [2001 x i32], ptr %473, i64 0, i64 %475
  store i32 %470, ptr %476, align 4, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #7
  br label %477

477:                                              ; preds = %468
  %478 = load i32, ptr %26, align 4, !tbaa !11
  %479 = add nsw i32 %478, -1
  store i32 %479, ptr %26, align 4, !tbaa !11
  br label %420, !llvm.loop !24

480:                                              ; preds = %425
  br label %481

481:                                              ; preds = %480
  %482 = load i32, ptr %25, align 4, !tbaa !11
  %483 = add nsw i32 %482, 1
  store i32 %483, ptr %25, align 4, !tbaa !11
  br label %410, !llvm.loop !25

484:                                              ; preds = %415
  %485 = load i64, ptr %8, align 8, !tbaa !8
  %486 = load i64, ptr %9, align 8, !tbaa !8
  %487 = icmp ne i64 %485, %486
  br i1 %487, label %488, label %633

488:                                              ; preds = %484
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #7
  %489 = load i64, ptr %18, align 8, !tbaa !8
  %490 = trunc i64 %489 to i32
  store i32 %490, ptr %28, align 4, !tbaa !11
  br label %491

491:                                              ; preds = %502, %488
  %492 = load i32, ptr %28, align 4, !tbaa !11
  %493 = sext i32 %492 to i64
  %494 = load i64, ptr %9, align 8, !tbaa !8
  %495 = icmp sle i64 %493, %494
  br i1 %495, label %497, label %496

496:                                              ; preds = %491
  store i32 41, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #7
  br label %505

497:                                              ; preds = %491
  %498 = load i32, ptr %28, align 4, !tbaa !11
  %499 = sext i32 %498 to i64
  %500 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %499
  %501 = getelementptr inbounds [2001 x i32], ptr %500, i64 0, i64 0
  store i32 1, ptr %501, align 4, !tbaa !11
  br label %502

502:                                              ; preds = %497
  %503 = load i32, ptr %28, align 4, !tbaa !11
  %504 = add nsw i32 %503, 1
  store i32 %504, ptr %28, align 4, !tbaa !11
  br label %491, !llvm.loop !26

505:                                              ; preds = %496
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #7
  store i32 1, ptr %29, align 4, !tbaa !11
  br label %506

506:                                              ; preds = %554, %505
  %507 = load i32, ptr %29, align 4, !tbaa !11
  %508 = sext i32 %507 to i64
  %509 = load i64, ptr %9, align 8, !tbaa !8
  %510 = icmp sle i64 %508, %509
  br i1 %510, label %512, label %511

511:                                              ; preds = %506
  store i32 44, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #7
  br label %557

512:                                              ; preds = %506
  %513 = load i64, ptr %9, align 8, !tbaa !8
  %514 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %513
  %515 = load i32, ptr %29, align 4, !tbaa !11
  %516 = sext i32 %515 to i64
  %517 = getelementptr inbounds [2001 x i64], ptr %514, i64 0, i64 %516
  %518 = load i64, ptr %517, align 8, !tbaa !8
  %519 = icmp ne i64 %518, 0
  br i1 %519, label %520, label %547

520:                                              ; preds = %512
  %521 = load i32, ptr %29, align 4, !tbaa !11
  %522 = and i32 %521, 1
  %523 = icmp ne i32 %522, 0
  br i1 %523, label %524, label %532

524:                                              ; preds = %520
  %525 = load i64, ptr %9, align 8, !tbaa !8
  %526 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %525
  %527 = load i32, ptr %29, align 4, !tbaa !11
  %528 = sext i32 %527 to i64
  %529 = getelementptr inbounds [2001 x i64], ptr %526, i64 0, i64 %528
  %530 = load i64, ptr %529, align 8, !tbaa !8
  %531 = sub nsw i64 998244353, %530
  br label %539

532:                                              ; preds = %520
  %533 = load i64, ptr %9, align 8, !tbaa !8
  %534 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %533
  %535 = load i32, ptr %29, align 4, !tbaa !11
  %536 = sext i32 %535 to i64
  %537 = getelementptr inbounds [2001 x i64], ptr %534, i64 0, i64 %536
  %538 = load i64, ptr %537, align 8, !tbaa !8
  br label %539

539:                                              ; preds = %532, %524
  %540 = phi i64 [ %531, %524 ], [ %538, %532 ]
  %541 = trunc i64 %540 to i32
  %542 = load i64, ptr %9, align 8, !tbaa !8
  %543 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %542
  %544 = load i32, ptr %29, align 4, !tbaa !11
  %545 = sext i32 %544 to i64
  %546 = getelementptr inbounds [2001 x i32], ptr %543, i64 0, i64 %545
  store i32 %541, ptr %546, align 4, !tbaa !11
  br label %553

547:                                              ; preds = %512
  %548 = load i64, ptr %9, align 8, !tbaa !8
  %549 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %548
  %550 = load i32, ptr %29, align 4, !tbaa !11
  %551 = sext i32 %550 to i64
  %552 = getelementptr inbounds [2001 x i32], ptr %549, i64 0, i64 %551
  store i32 0, ptr %552, align 4, !tbaa !11
  br label %553

553:                                              ; preds = %547, %539
  br label %554

554:                                              ; preds = %553
  %555 = load i32, ptr %29, align 4, !tbaa !11
  %556 = add nsw i32 %555, 1
  store i32 %556, ptr %29, align 4, !tbaa !11
  br label %506, !llvm.loop !27

557:                                              ; preds = %511
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #7
  store i32 1, ptr %30, align 4, !tbaa !11
  br label %558

558:                                              ; preds = %629, %557
  %559 = load i32, ptr %30, align 4, !tbaa !11
  %560 = sext i32 %559 to i64
  %561 = load i64, ptr %9, align 8, !tbaa !8
  %562 = icmp sle i64 %560, %561
  br i1 %562, label %564, label %563

563:                                              ; preds = %558
  store i32 47, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #7
  br label %632

564:                                              ; preds = %558
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #7
  %565 = load i64, ptr %9, align 8, !tbaa !8
  %566 = sub nsw i64 %565, 1
  %567 = trunc i64 %566 to i32
  store i32 %567, ptr %31, align 4, !tbaa !11
  br label %568

568:                                              ; preds = %625, %564
  %569 = load i32, ptr %31, align 4, !tbaa !11
  %570 = sext i32 %569 to i64
  %571 = load i64, ptr %18, align 8, !tbaa !8
  %572 = icmp sge i64 %570, %571
  br i1 %572, label %574, label %573

573:                                              ; preds = %568
  store i32 50, ptr %5, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #7
  br label %628

574:                                              ; preds = %568
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #7
  %575 = load i32, ptr %31, align 4, !tbaa !11
  %576 = add nsw i32 %575, 1
  %577 = sext i32 %576 to i64
  %578 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %577
  %579 = load i32, ptr %30, align 4, !tbaa !11
  %580 = sub nsw i32 %579, 1
  %581 = sext i32 %580 to i64
  %582 = getelementptr inbounds [2001 x i32], ptr %578, i64 0, i64 %581
  %583 = load i32, ptr %582, align 4, !tbaa !11
  %584 = load i32, ptr %31, align 4, !tbaa !11
  %585 = add nsw i32 %584, 1
  %586 = sext i32 %585 to i64
  %587 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %586
  %588 = load i32, ptr %30, align 4, !tbaa !11
  %589 = sext i32 %588 to i64
  %590 = getelementptr inbounds [2001 x i32], ptr %587, i64 0, i64 %589
  %591 = load i32, ptr %590, align 4, !tbaa !11
  %592 = add nsw i32 %583, %591
  %593 = sext i32 %592 to i64
  store i64 %593, ptr %32, align 8, !tbaa !8
  %594 = load i64, ptr %32, align 8, !tbaa !8
  %595 = icmp sge i64 %594, 998244353
  br i1 %595, label %596, label %599

596:                                              ; preds = %574
  %597 = load i64, ptr %32, align 8, !tbaa !8
  %598 = sub nsw i64 %597, 998244353
  store i64 %598, ptr %32, align 8, !tbaa !8
  br label %599

599:                                              ; preds = %596, %574
  %600 = load i32, ptr %31, align 4, !tbaa !11
  %601 = sext i32 %600 to i64
  %602 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %601
  %603 = load i32, ptr %30, align 4, !tbaa !11
  %604 = sub nsw i32 %603, 1
  %605 = sext i32 %604 to i64
  %606 = getelementptr inbounds [2001 x i32], ptr %602, i64 0, i64 %605
  %607 = load i32, ptr %606, align 4, !tbaa !11
  %608 = sext i32 %607 to i64
  %609 = load i64, ptr %32, align 8, !tbaa !8
  %610 = add nsw i64 %609, %608
  store i64 %610, ptr %32, align 8, !tbaa !8
  %611 = load i64, ptr %32, align 8, !tbaa !8
  %612 = icmp sge i64 %611, 998244353
  br i1 %612, label %613, label %616

613:                                              ; preds = %599
  %614 = load i64, ptr %32, align 8, !tbaa !8
  %615 = sub nsw i64 %614, 998244353
  store i64 %615, ptr %32, align 8, !tbaa !8
  br label %616

616:                                              ; preds = %613, %599
  %617 = load i64, ptr %32, align 8, !tbaa !8
  %618 = trunc i64 %617 to i32
  %619 = load i32, ptr %31, align 4, !tbaa !11
  %620 = sext i32 %619 to i64
  %621 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds ([2 x [2001 x [2001 x i32]]], ptr @aa, i64 0, i64 1), i64 0, i64 %620
  %622 = load i32, ptr %30, align 4, !tbaa !11
  %623 = sext i32 %622 to i64
  %624 = getelementptr inbounds [2001 x i32], ptr %621, i64 0, i64 %623
  store i32 %618, ptr %624, align 4, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #7
  br label %625

625:                                              ; preds = %616
  %626 = load i32, ptr %31, align 4, !tbaa !11
  %627 = add nsw i32 %626, -1
  store i32 %627, ptr %31, align 4, !tbaa !11
  br label %568, !llvm.loop !28

628:                                              ; preds = %573
  br label %629

629:                                              ; preds = %628
  %630 = load i32, ptr %30, align 4, !tbaa !11
  %631 = add nsw i32 %630, 1
  store i32 %631, ptr %30, align 4, !tbaa !11
  br label %558, !llvm.loop !29

632:                                              ; preds = %563
  br label %633

633:                                              ; preds = %632, %484
  %634 = load i64, ptr %8, align 8, !tbaa !8
  %635 = load i64, ptr %9, align 8, !tbaa !8
  %636 = load i64, ptr %10, align 8, !tbaa !8
  %637 = load i64, ptr %11, align 8, !tbaa !8
  %638 = call noundef i64 @_Z1fxxxx(i64 noundef %634, i64 noundef %635, i64 noundef %636, i64 noundef %637)
  %639 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEx(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, i64 noundef %638)
  %640 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %639, ptr noundef @.str.1)
  store i32 0, ptr %5, align 4
  br label %641

641:                                              ; preds = %633, %328
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #7
  %642 = load i32, ptr %5, align 4
  switch i32 %642, label %649 [
    i32 0, label %643
    i32 16, label %644
  ]

643:                                              ; preds = %641
  br label %644

644:                                              ; preds = %643, %641
  %645 = load i64, ptr %12, align 8, !tbaa !8
  %646 = add nsw i64 %645, 1
  store i64 %646, ptr %12, align 8, !tbaa !8
  br label %158, !llvm.loop !30

647:                                              ; preds = %162
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  %648 = load i32, ptr %1, align 4
  ret i32 %648

649:                                              ; preds = %641, %314
  unreachable
}

declare noundef zeroext i1 @_ZNSt8ios_base15sync_with_stdioEb(i1 noundef zeroext) #3

; Function Attrs: mustprogress nounwind uwtable
declare noundef ptr @_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo(ptr noundef nonnull align 8 dereferenceable(264), ptr noundef) #0 align 2

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(8)) #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIxERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) #5

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) #6

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEx(ptr noundef nonnull align 8 dereferenceable(8), i64 noundef) #4 align 2

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress norecurse uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"long long", !10, i64 0}
!10 = !{!"omnipotent char", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !10, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = distinct !{!15, !14}
!16 = distinct !{!16, !14}
!17 = distinct !{!17, !14}
!18 = distinct !{!18, !14}
!19 = distinct !{!19, !14}
!20 = distinct !{!20, !14}
!21 = distinct !{!21, !14}
!22 = distinct !{!22, !14}
!23 = distinct !{!23, !14}
!24 = distinct !{!24, !14}
!25 = distinct !{!25, !14}
!26 = distinct !{!26, !14}
!27 = distinct !{!27, !14}
!28 = distinct !{!28, !14}
!29 = distinct !{!29, !14}
!30 = distinct !{!30, !14}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.std::basic_istream" = type { ptr, i64, %"class.std::basic_ios" }
%"class.std::basic_ios" = type { %"class.std::ios_base", ptr, i8, i8, ptr, ptr, ptr, ptr }
%"class.std::ios_base" = type { ptr, i64, i64, i32, i32, i32, ptr, %"struct.std::ios_base::_Words", [8 x %"struct.std::ios_base::_Words"], i32, ptr, %"class.std::locale" }
%"struct.std::ios_base::_Words" = type { ptr, i64 }
%"class.std::locale" = type { ptr }
%"class.std::basic_ostream" = type { ptr, %"class.std::basic_ios" }

@binom = external dso_local local_unnamed_addr global [2001 x [2001 x i64]], align 16
@pow2 = external dso_local local_unnamed_addr global [2001 x i64], align 16
@invpow2 = external dso_local local_unnamed_addr global [2001 x i64], align 16
@powq = external dso_local local_unnamed_addr global [4002 x i64], align 16
@aa = external dso_local local_unnamed_addr global [2 x [2001 x [2001 x i32]]], align 16
@_ZSt3cin = external global %"class.std::basic_istream", align 8
@_ZSt4cout = external global %"class.std::basic_ostream", align 8
@.str = external hidden unnamed_addr constant [3 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [2 x i8], align 1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_Z6modinvxx(i64 noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_Z3powxxi(i64 noundef, i64 noundef, i32 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_Z1fxxxx(i64 noundef, i64 noundef, i64 noundef, i64 noundef) local_unnamed_addr #0

; Function Attrs: mustprogress norecurse uwtable
define dso_local noundef i32 @main() local_unnamed_addr #2 {
  %1 = alloca i64, align 8
  %2 = alloca i64, align 8
  %3 = alloca i64, align 8
  %4 = alloca i64, align 8
  %5 = alloca i64, align 8
  %6 = tail call noundef zeroext i1 @_ZNSt8ios_base15sync_with_stdioEb(i1 noundef zeroext false)
  %7 = load ptr, ptr @_ZSt3cin, align 8, !tbaa !5
  %8 = getelementptr i8, ptr %7, i64 -24
  %9 = load i64, ptr %8, align 8
  %10 = getelementptr inbounds i8, ptr @_ZSt3cin, i64 %9
  %11 = tail call noundef ptr @_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo(ptr noundef nonnull align 8 dereferenceable(264) %10, ptr noundef null)
  store i64 1, ptr @pow2, align 16, !tbaa !8
  store i64 1, ptr @invpow2, align 16, !tbaa !8
  br label %12

12:                                               ; preds = %12, %0
  %13 = phi i64 [ 1, %0 ], [ %spec.select.1, %12 ]
  %indvars.iv = phi i64 [ 1, %0 ], [ %indvars.iv.next.1, %12 ]
  %14 = shl nsw i64 %13, 1
  %15 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %indvars.iv
  %16 = icmp sgt i64 %13, 499122176
  %17 = add nsw i64 %14, -998244353
  %spec.select = select i1 %16, i64 %17, i64 %14
  store i64 %spec.select, ptr %15, align 8, !tbaa !8
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %18 = shl nsw i64 %spec.select, 1
  %19 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %indvars.iv.next
  %20 = icmp sgt i64 %spec.select, 499122176
  %21 = add nsw i64 %18, -998244353
  %spec.select.1 = select i1 %20, i64 %21, i64 %18
  store i64 %spec.select.1, ptr %19, align 8, !tbaa !8
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %exitcond.not.1 = icmp eq i64 %indvars.iv.next.1, 2001
  br i1 %exitcond.not.1, label %.preheader225, label %12, !llvm.loop !11

.preheader225:                                    ; preds = %12, %.preheader225
  %indvars.iv295 = phi i64 [ %indvars.iv.next296, %.preheader225 ], [ 1, %12 ]
  %22 = getelementptr inbounds [2001 x i64], ptr @pow2, i64 0, i64 %indvars.iv295
  %23 = load i64, ptr %22, align 8, !tbaa !8
  %24 = tail call noundef i64 @_Z6modinvxx(i64 noundef %23, i64 noundef 998244353)
  %25 = getelementptr inbounds [2001 x i64], ptr @invpow2, i64 0, i64 %indvars.iv295
  store i64 %24, ptr %25, align 8, !tbaa !8
  %indvars.iv.next296 = add nuw nsw i64 %indvars.iv295, 1
  %exitcond298.not = icmp eq i64 %indvars.iv.next296, 2001
  br i1 %exitcond298.not, label %.preheader224, label %.preheader225, !llvm.loop !13

26:                                               ; preds = %._crit_edge
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %1) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #8
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #8
  %27 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) @_ZSt3cin, ptr noundef nonnull align 8 dereferenceable(8) %1)
  %28 = load i64, ptr %1, align 8, !tbaa !8
  %29 = icmp sgt i64 %28, 0
  br i1 %29, label %.lr.ph288, label %._crit_edge289

.preheader224:                                    ; preds = %.preheader225, %._crit_edge
  %indvars.iv303 = phi i64 [ %indvars.iv.next304, %._crit_edge ], [ 0, %.preheader225 ]
  %30 = add nsw i64 %indvars.iv303, -1
  %31 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %indvars.iv303
  %32 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %indvars.iv303, i64 %indvars.iv303
  store i64 1, ptr %32, align 8, !tbaa !8
  store i64 1, ptr %31, align 8, !tbaa !8
  %33 = icmp ugt i64 %indvars.iv303, 1
  br i1 %33, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %.preheader224
  %34 = add nsw i64 %indvars.iv303, -1
  %.phi.trans.insert = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %34, i64 0
  %.pre = load i64, ptr %.phi.trans.insert, align 8, !tbaa !8
  %min.iters.check = icmp ult i64 %indvars.iv303, 5
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.lr.ph
  %.ph = phi i64 [ %.pre, %.lr.ph ], [ %vector.recur.extract, %middle.block ]
  %indvars.iv299.ph = phi i64 [ 1, %.lr.ph ], [ %ind.end, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.lr.ph
  %n.vec = and i64 %30, -4
  %ind.end = or disjoint i64 %n.vec, 1
  %vector.recur.init = insertelement <2 x i64> poison, i64 %.pre, i64 1
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vector.recur = phi <2 x i64> [ %vector.recur.init, %vector.ph ], [ %wide.load352, %vector.body ]
  %offset.idx = or disjoint i64 %index, 1
  %35 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %34, i64 %offset.idx
  %36 = getelementptr inbounds i8, ptr %35, i64 16
  %wide.load = load <2 x i64>, ptr %35, align 8, !tbaa !8
  %wide.load352 = load <2 x i64>, ptr %36, align 8, !tbaa !8
  %37 = shufflevector <2 x i64> %vector.recur, <2 x i64> %wide.load, <2 x i32> <i32 1, i32 2>
  %38 = shufflevector <2 x i64> %wide.load, <2 x i64> %wide.load352, <2 x i32> <i32 1, i32 2>
  %39 = add nsw <2 x i64> %wide.load, %37
  %40 = add nsw <2 x i64> %wide.load352, %38
  %41 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %indvars.iv303, i64 %offset.idx
  %42 = icmp sgt <2 x i64> %39, <i64 998244352, i64 998244352>
  %43 = icmp sgt <2 x i64> %40, <i64 998244352, i64 998244352>
  %44 = add nsw <2 x i64> %39, <i64 -998244353, i64 -998244353>
  %45 = add nsw <2 x i64> %40, <i64 -998244353, i64 -998244353>
  %46 = select <2 x i1> %42, <2 x i64> %44, <2 x i64> %39
  %47 = select <2 x i1> %43, <2 x i64> %45, <2 x i64> %40
  %48 = getelementptr inbounds i8, ptr %41, i64 16
  store <2 x i64> %46, ptr %41, align 8, !tbaa !8
  store <2 x i64> %47, ptr %48, align 8, !tbaa !8
  %index.next = add nuw i64 %index, 4
  %49 = icmp eq i64 %index.next, %n.vec
  br i1 %49, label %middle.block, label %vector.body, !llvm.loop !14

middle.block:                                     ; preds = %vector.body
  %vector.recur.extract = extractelement <2 x i64> %wide.load352, i64 1
  %cmp.n = icmp eq i64 %30, %n.vec
  br i1 %cmp.n, label %._crit_edge, label %scalar.ph.preheader

._crit_edge:                                      ; preds = %scalar.ph, %middle.block, %.preheader224
  %indvars.iv.next304 = add nuw nsw i64 %indvars.iv303, 1
  %exitcond306.not = icmp eq i64 %indvars.iv.next304, 2001
  br i1 %exitcond306.not, label %26, label %.preheader224, !llvm.loop !17

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %50 = phi i64 [ %52, %scalar.ph ], [ %.ph, %scalar.ph.preheader ]
  %indvars.iv299 = phi i64 [ %indvars.iv.next300, %scalar.ph ], [ %indvars.iv299.ph, %scalar.ph.preheader ]
  %51 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %34, i64 %indvars.iv299
  %52 = load i64, ptr %51, align 8, !tbaa !8
  %53 = add nsw i64 %52, %50
  %54 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %indvars.iv303, i64 %indvars.iv299
  %55 = icmp sgt i64 %53, 998244352
  %56 = add nsw i64 %53, -998244353
  %spec.select210 = select i1 %55, i64 %56, i64 %53
  store i64 %spec.select210, ptr %54, align 8, !tbaa !8
  %indvars.iv.next300 = add nuw nsw i64 %indvars.iv299, 1
  %exitcond302.not = icmp eq i64 %indvars.iv.next300, %indvars.iv303
  br i1 %exitcond302.not, label %._crit_edge, label %scalar.ph, !llvm.loop !18

._crit_edge289:                                   ; preds = %228, %26
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2) #8
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1) #8
  ret i32 0

.lr.ph288:                                        ; preds = %26, %228
  %.0157286 = phi i64 [ %229, %228 ], [ 0, %26 ]
  %57 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) @_ZSt3cin, ptr noundef nonnull align 8 dereferenceable(8) %2)
  %58 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %57, ptr noundef nonnull align 8 dereferenceable(8) %3)
  %59 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %58, ptr noundef nonnull align 8 dereferenceable(8) %4)
  %60 = call noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16) %59, ptr noundef nonnull align 8 dereferenceable(8) %5)
  %61 = load i64, ptr %2, align 8, !tbaa !8
  %62 = srem i64 %61, 2
  %63 = load i64, ptr %3, align 8, !tbaa !8
  %64 = srem i64 %63, 2
  %65 = icmp eq i64 %62, %64
  br i1 %65, label %66, label %77

66:                                               ; preds = %.lr.ph288
  %67 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIxERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8) %3, ptr noundef nonnull align 8 dereferenceable(8) %2)
  %68 = load i64, ptr %67, align 8, !tbaa !8
  %69 = and i64 %68, 2147483648
  %.not192239.not = icmp eq i64 %69, 0
  br i1 %.not192239.not, label %.lr.ph242.preheader, label %.loopexit222thread-pre-split

.lr.ph242.preheader:                              ; preds = %66
  %.neg351 = mul i64 %68, -4294967296
  %70 = ashr exact i64 %.neg351, 32
  %71 = and i64 %68, 2147483647
  br label %.lr.ph242

.lr.ph242:                                        ; preds = %.lr.ph242.preheader, %.lr.ph242
  %indvars.iv313 = phi i64 [ %70, %.lr.ph242.preheader ], [ %indvars.iv.next314, %.lr.ph242 ]
  %72 = load i64, ptr %4, align 8, !tbaa !8
  %73 = call noundef i32 @_Z3powxxi(i64 noundef %indvars.iv313, i64 noundef %72, i32 noundef 998244353)
  %74 = sext i32 %73 to i64
  %75 = add nsw i64 %indvars.iv313, 2000
  %76 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %75
  store i64 %74, ptr %76, align 8, !tbaa !8
  %indvars.iv.next314 = add nsw i64 %indvars.iv313, 2
  %.not192 = icmp sgt i64 %indvars.iv.next314, %71
  br i1 %.not192, label %.loopexit222thread-pre-split, label %.lr.ph242, !llvm.loop !19

77:                                               ; preds = %.lr.ph288
  %.neg = mul i64 %61, -4294967296
  %78 = ashr exact i64 %.neg, 32
  %.not230 = icmp slt i64 %61, %78
  br i1 %.not230, label %._crit_edge234, label %.lr.ph233

._crit_edge234.loopexit:                          ; preds = %.lr.ph233
  %.pre346 = load i64, ptr %3, align 8, !tbaa !8
  br label %._crit_edge234

._crit_edge234:                                   ; preds = %._crit_edge234.loopexit, %77
  %79 = phi i64 [ %.pre346, %._crit_edge234.loopexit ], [ %63, %77 ]
  %.neg349 = mul i64 %79, -4294967296
  %80 = ashr exact i64 %.neg349, 32
  %.not191235 = icmp slt i64 %79, %80
  br i1 %.not191235, label %.loopexit222thread-pre-split, label %.lr.ph238

.lr.ph233:                                        ; preds = %77, %.lr.ph233
  %indvars.iv307 = phi i64 [ %indvars.iv.next308, %.lr.ph233 ], [ %78, %77 ]
  %81 = load i64, ptr %4, align 8, !tbaa !8
  %82 = call noundef i32 @_Z3powxxi(i64 noundef %indvars.iv307, i64 noundef %81, i32 noundef 998244353)
  %83 = sext i32 %82 to i64
  %84 = add nsw i64 %indvars.iv307, 2000
  %85 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %84
  store i64 %83, ptr %85, align 8, !tbaa !8
  %indvars.iv.next308 = add nsw i64 %indvars.iv307, 2
  %86 = load i64, ptr %2, align 8, !tbaa !8
  %.not = icmp slt i64 %86, %indvars.iv.next308
  br i1 %.not, label %._crit_edge234.loopexit, label %.lr.ph233, !llvm.loop !20

.lr.ph238:                                        ; preds = %._crit_edge234, %.lr.ph238
  %indvars.iv310 = phi i64 [ %indvars.iv.next311, %.lr.ph238 ], [ %80, %._crit_edge234 ]
  %87 = load i64, ptr %4, align 8, !tbaa !8
  %88 = call noundef i32 @_Z3powxxi(i64 noundef %indvars.iv310, i64 noundef %87, i32 noundef 998244353)
  %89 = sext i32 %88 to i64
  %90 = add nsw i64 %indvars.iv310, 2000
  %91 = getelementptr inbounds [4002 x i64], ptr @powq, i64 0, i64 %90
  store i64 %89, ptr %91, align 8, !tbaa !8
  %indvars.iv.next311 = add nsw i64 %indvars.iv310, 2
  %92 = load i64, ptr %3, align 8
  %.not191 = icmp slt i64 %92, %indvars.iv.next311
  br i1 %.not191, label %.loopexit222, label %.lr.ph238, !llvm.loop !21

.loopexit222thread-pre-split:                     ; preds = %.lr.ph242, %66, %._crit_edge234
  %.pr = load i64, ptr %3, align 8
  br label %.loopexit222

.loopexit222:                                     ; preds = %.lr.ph238, %.loopexit222thread-pre-split
  %93 = phi i64 [ %.pr, %.loopexit222thread-pre-split ], [ %92, %.lr.ph238 ]
  %94 = load i64, ptr %2, align 8, !tbaa !8
  %95 = add i64 %94, 1
  %96 = add i64 %93, 1
  %.not193243 = icmp slt i64 %94, 0
  br i1 %.not193243, label %._crit_edge249, label %.lr.ph248

.lr.ph248:                                        ; preds = %.loopexit222
  %97 = load i64, ptr %5, align 8, !tbaa !8
  br label %100

._crit_edge249:                                   ; preds = %115, %.loopexit222
  %.0150.lcssa = phi i64 [ %95, %.loopexit222 ], [ %.4, %115 ]
  %.0148.lcssa = phi i64 [ %96, %.loopexit222 ], [ %.3, %115 ]
  %98 = icmp sgt i64 %.0150.lcssa, %94
  %99 = icmp sgt i64 %.0148.lcssa, %93
  %or.cond218 = select i1 %98, i1 true, i1 %99
  br i1 %or.cond218, label %117, label %119

100:                                              ; preds = %.lr.ph248, %115
  %.0147246 = phi i64 [ 0, %.lr.ph248 ], [ %116, %115 ]
  %.0148245 = phi i64 [ %96, %.lr.ph248 ], [ %.3, %115 ]
  %.0150244 = phi i64 [ %95, %.lr.ph248 ], [ %.4, %115 ]
  %101 = mul nsw i64 %.0147246, %93
  %102 = sub nsw i64 %97, %101
  %103 = shl nuw nsw i64 %.0147246, 1
  %104 = sub nsw i64 %94, %103
  %.not207 = icmp eq i64 %94, %103
  %105 = icmp eq i64 %101, %97
  %or.cond = select i1 %.not207, i1 %105, i1 false
  br i1 %or.cond, label %106, label %107

106:                                              ; preds = %100
  %spec.select211 = call i64 @llvm.smin.i64(i64 %.0150244, i64 %.0147246)
  br label %115

107:                                              ; preds = %100
  br i1 %.not207, label %115, label %108

108:                                              ; preds = %107
  %109 = srem i64 %102, %104
  %110 = sdiv i64 %102, %104
  %.not208 = icmp eq i64 %109, 0
  br i1 %.not208, label %111, label %115

111:                                              ; preds = %108
  %112 = icmp slt i64 %110, 0
  %113 = icmp sgt i64 %110, %93
  %or.cond213 = select i1 %112, i1 true, i1 %113
  br i1 %or.cond213, label %115, label %114

114:                                              ; preds = %111
  %spec.select214 = call i64 @llvm.smin.i64(i64 %.0150244, i64 %.0147246)
  %.1149 = call i64 @llvm.smin.i64(i64 %.0148245, i64 %110)
  br label %115

115:                                              ; preds = %114, %111, %107, %108, %106
  %.4 = phi i64 [ %spec.select211, %106 ], [ %.0150244, %108 ], [ %.0150244, %107 ], [ %spec.select214, %114 ], [ %.0150244, %111 ]
  %.3 = phi i64 [ 0, %106 ], [ %.0148245, %108 ], [ %.0148245, %107 ], [ %.1149, %114 ], [ %.0148245, %111 ]
  %116 = add nuw i64 %.0147246, 1
  %exitcond316.not = icmp eq i64 %.0147246, %94
  br i1 %exitcond316.not, label %._crit_edge249, label %100, !llvm.loop !22

117:                                              ; preds = %._crit_edge249
  %118 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, ptr noundef nonnull @.str)
  br label %228

119:                                              ; preds = %._crit_edge249
  %120 = icmp eq i64 %94, %93
  %121 = call i64 @llvm.smin.i64(i64 %.0150.lcssa, i64 %.0148.lcssa)
  %.5 = select i1 %120, i64 %121, i64 %.0150.lcssa
  %sext = shl i64 %.5, 32
  %122 = ashr exact i64 %sext, 32
  %.not194251 = icmp slt i64 %94, %122
  br i1 %.not194251, label %.preheader221, label %.lr.ph254.preheader

.lr.ph254.preheader:                              ; preds = %119
  %123 = add i64 %94, 1
  %124 = sub i64 %123, %.5
  %125 = sub i64 %94, %122
  %xtraiter = and i64 %124, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph254.prol.loopexit, label %.lr.ph254.prol

.lr.ph254.prol:                                   ; preds = %.lr.ph254.preheader, %.lr.ph254.prol
  %indvars.iv317.prol = phi i64 [ %indvars.iv.next318.prol, %.lr.ph254.prol ], [ %122, %.lr.ph254.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph254.prol ], [ 0, %.lr.ph254.preheader ]
  %126 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %indvars.iv317.prol
  store i32 1, ptr %126, align 4, !tbaa !23
  %indvars.iv.next318.prol = add nsw i64 %indvars.iv317.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph254.prol.loopexit, label %.lr.ph254.prol, !llvm.loop !25

.lr.ph254.prol.loopexit:                          ; preds = %.lr.ph254.prol, %.lr.ph254.preheader
  %indvars.iv317.unr = phi i64 [ %122, %.lr.ph254.preheader ], [ %indvars.iv.next318.prol, %.lr.ph254.prol ]
  %127 = icmp ult i64 %125, 3
  br i1 %127, label %.preheader221, label %.lr.ph254

.preheader221:                                    ; preds = %.lr.ph254.prol.loopexit, %.lr.ph254, %119
  %.not195255 = icmp slt i64 %94, 1
  br i1 %.not195255, label %._crit_edge268, label %.lr.ph257.preheader

.lr.ph257.preheader:                              ; preds = %.preheader221
  %xtraiter353 = and i64 %94, 1
  %128 = icmp eq i64 %94, 1
  br i1 %128, label %.preheader220.unr-lcssa, label %.lr.ph257.preheader.new

.lr.ph257.preheader.new:                          ; preds = %.lr.ph257.preheader
  %unroll_iter = and i64 %94, 9223372036854775806
  br label %.lr.ph257

.lr.ph254:                                        ; preds = %.lr.ph254.prol.loopexit, %.lr.ph254
  %indvars.iv317 = phi i64 [ %indvars.iv.next318.3, %.lr.ph254 ], [ %indvars.iv317.unr, %.lr.ph254.prol.loopexit ]
  %129 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %indvars.iv317
  store i32 1, ptr %129, align 4, !tbaa !23
  %indvars.iv.next318 = add nsw i64 %indvars.iv317, 1
  %130 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %indvars.iv.next318
  store i32 1, ptr %130, align 4, !tbaa !23
  %indvars.iv.next318.1 = add nsw i64 %indvars.iv317, 2
  %131 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %indvars.iv.next318.1
  store i32 1, ptr %131, align 4, !tbaa !23
  %indvars.iv.next318.2 = add nsw i64 %indvars.iv317, 3
  %132 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %indvars.iv.next318.2
  store i32 1, ptr %132, align 4, !tbaa !23
  %indvars.iv.next318.3 = add nsw i64 %indvars.iv317, 4
  %.not194.not.3 = icmp sgt i64 %94, %indvars.iv.next318.2
  br i1 %.not194.not.3, label %.lr.ph254, label %.preheader221, !llvm.loop !27

.preheader220.unr-lcssa:                          ; preds = %.lr.ph257, %.lr.ph257.preheader
  %indvars.iv320.unr = phi i64 [ 1, %.lr.ph257.preheader ], [ %indvars.iv.next321.1, %.lr.ph257 ]
  %lcmp.mod354.not = icmp eq i64 %xtraiter353, 0
  br i1 %lcmp.mod354.not, label %.preheader220, label %.lr.ph257.epil

.lr.ph257.epil:                                   ; preds = %.preheader220.unr-lcssa
  %133 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %94, i64 %indvars.iv320.unr
  %134 = load i64, ptr %133, align 8, !tbaa !8
  %.not205.epil = icmp eq i64 %134, 0
  %135 = and i64 %indvars.iv320.unr, 1
  %.not206.epil = icmp eq i64 %135, 0
  %136 = sub nsw i64 998244353, %134
  %137 = select i1 %.not206.epil, i64 %134, i64 %136
  %138 = trunc i64 %137 to i32
  %.sink.epil = select i1 %.not205.epil, i32 0, i32 %138
  %139 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %94, i64 %indvars.iv320.unr
  store i32 %.sink.epil, ptr %139, align 4
  br label %.preheader220

.preheader220:                                    ; preds = %.preheader220.unr-lcssa, %.lr.ph257.epil
  br i1 %.not195255, label %._crit_edge268, label %.lr.ph267

.lr.ph267:                                        ; preds = %.preheader220
  %140 = trunc i64 %94 to i32
  %.0140258 = add i32 %140, -1
  %141 = sext i32 %.0140258 to i64
  %.not204259 = icmp sgt i64 %.5, %141
  br i1 %.not204259, label %._crit_edge268, label %.lr.ph263

.lr.ph257:                                        ; preds = %.lr.ph257, %.lr.ph257.preheader.new
  %indvars.iv320 = phi i64 [ 1, %.lr.ph257.preheader.new ], [ %indvars.iv.next321.1, %.lr.ph257 ]
  %niter = phi i64 [ 0, %.lr.ph257.preheader.new ], [ %niter.next.1, %.lr.ph257 ]
  %142 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %94, i64 %indvars.iv320
  %143 = load i64, ptr %142, align 8, !tbaa !8
  %.not205 = icmp eq i64 %143, 0
  %144 = trunc i64 %143 to i32
  %145 = sub i32 998244353, %144
  %.sink = select i1 %.not205, i32 0, i32 %145
  %146 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %94, i64 %indvars.iv320
  store i32 %.sink, ptr %146, align 4
  %indvars.iv.next321 = add nuw nsw i64 %indvars.iv320, 1
  %147 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %94, i64 %indvars.iv.next321
  %148 = load i64, ptr %147, align 8, !tbaa !8
  %149 = trunc i64 %148 to i32
  %150 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %94, i64 %indvars.iv.next321
  store i32 %149, ptr %150, align 4
  %indvars.iv.next321.1 = add nuw nsw i64 %indvars.iv320, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.preheader220.unr-lcssa, label %.lr.ph257, !llvm.loop !28

._crit_edge268:                                   ; preds = %._crit_edge264, %.preheader221, %.lr.ph267, %.preheader220
  br i1 %120, label %.loopexit, label %172

.lr.ph263:                                        ; preds = %.lr.ph267, %._crit_edge264
  %indvars.iv324 = phi i64 [ %indvars.iv.next325, %._crit_edge264 ], [ 1, %.lr.ph267 ]
  %151 = add nsw i64 %indvars.iv324, -1
  br label %152

._crit_edge264:                                   ; preds = %152
  %indvars.iv.next325 = add nuw nsw i64 %indvars.iv324, 1
  %exitcond327 = icmp eq i64 %indvars.iv324, %94
  br i1 %exitcond327, label %._crit_edge268, label %.lr.ph263, !llvm.loop !29

152:                                              ; preds = %.lr.ph263, %152
  %153 = phi i64 [ %141, %.lr.ph263 ], [ %171, %152 ]
  %.0140261 = phi i32 [ %.0140258, %.lr.ph263 ], [ %.0140, %152 ]
  %.0140.in260 = phi i32 [ %140, %.lr.ph263 ], [ %.0140261, %152 ]
  %154 = sext i32 %.0140.in260 to i64
  %155 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %154, i64 %151
  %156 = load i32, ptr %155, align 4, !tbaa !23
  %157 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %154, i64 %indvars.iv324
  %158 = load i32, ptr %157, align 4, !tbaa !23
  %159 = add nsw i32 %158, %156
  %160 = sext i32 %159 to i64
  %161 = icmp sgt i32 %159, 998244352
  %162 = add nsw i64 %160, -998244353
  %spec.select216 = select i1 %161, i64 %162, i64 %160
  %163 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %153, i64 %151
  %164 = load i32, ptr %163, align 4, !tbaa !23
  %165 = sext i32 %164 to i64
  %166 = add nsw i64 %spec.select216, %165
  %167 = icmp sgt i64 %166, 998244352
  %168 = add nsw i64 %166, 3296722943
  %.1139 = select i1 %167, i64 %168, i64 %166
  %169 = trunc i64 %.1139 to i32
  %170 = getelementptr inbounds [2001 x [2001 x i32]], ptr @aa, i64 0, i64 %153, i64 %indvars.iv324
  store i32 %169, ptr %170, align 4, !tbaa !23
  %.0140 = add i32 %.0140261, -1
  %171 = sext i32 %.0140 to i64
  %.not204 = icmp sgt i64 %.5, %171
  br i1 %.not204, label %._crit_edge264, label %152, !llvm.loop !30

172:                                              ; preds = %._crit_edge268
  %sext290 = shl i64 %.0148.lcssa, 32
  %173 = ashr exact i64 %sext290, 32
  %.not198269 = icmp slt i64 %93, %173
  br i1 %.not198269, label %.preheader219, label %.lr.ph272.preheader

.lr.ph272.preheader:                              ; preds = %172
  %174 = add i64 %93, 1
  %175 = sub i64 %174, %.0148.lcssa
  %176 = sub i64 %93, %173
  %xtraiter355 = and i64 %175, 3
  %lcmp.mod356.not = icmp eq i64 %xtraiter355, 0
  br i1 %lcmp.mod356.not, label %.lr.ph272.prol.loopexit, label %.lr.ph272.prol

.lr.ph272.prol:                                   ; preds = %.lr.ph272.preheader, %.lr.ph272.prol
  %indvars.iv331.prol = phi i64 [ %indvars.iv.next332.prol, %.lr.ph272.prol ], [ %173, %.lr.ph272.preheader ]
  %prol.iter357 = phi i64 [ %prol.iter357.next, %.lr.ph272.prol ], [ 0, %.lr.ph272.preheader ]
  %177 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %indvars.iv331.prol
  store i32 1, ptr %177, align 4, !tbaa !23
  %indvars.iv.next332.prol = add nsw i64 %indvars.iv331.prol, 1
  %prol.iter357.next = add i64 %prol.iter357, 1
  %prol.iter357.cmp.not = icmp eq i64 %prol.iter357.next, %xtraiter355
  br i1 %prol.iter357.cmp.not, label %.lr.ph272.prol.loopexit, label %.lr.ph272.prol, !llvm.loop !31

.lr.ph272.prol.loopexit:                          ; preds = %.lr.ph272.prol, %.lr.ph272.preheader
  %indvars.iv331.unr = phi i64 [ %173, %.lr.ph272.preheader ], [ %indvars.iv.next332.prol, %.lr.ph272.prol ]
  %178 = icmp ult i64 %176, 3
  br i1 %178, label %.preheader219, label %.lr.ph272

.preheader219:                                    ; preds = %.lr.ph272.prol.loopexit, %.lr.ph272, %172
  %.not199273 = icmp slt i64 %93, 1
  br i1 %.not199273, label %.loopexit, label %.lr.ph275.preheader

.lr.ph275.preheader:                              ; preds = %.preheader219
  %xtraiter358 = and i64 %93, 1
  %179 = icmp eq i64 %93, 1
  br i1 %179, label %.preheader.unr-lcssa, label %.lr.ph275.preheader.new

.lr.ph275.preheader.new:                          ; preds = %.lr.ph275.preheader
  %unroll_iter360 = and i64 %93, 9223372036854775806
  br label %.lr.ph275

.lr.ph272:                                        ; preds = %.lr.ph272.prol.loopexit, %.lr.ph272
  %indvars.iv331 = phi i64 [ %indvars.iv.next332.3, %.lr.ph272 ], [ %indvars.iv331.unr, %.lr.ph272.prol.loopexit ]
  %180 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %indvars.iv331
  store i32 1, ptr %180, align 4, !tbaa !23
  %indvars.iv.next332 = add nsw i64 %indvars.iv331, 1
  %181 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %indvars.iv.next332
  store i32 1, ptr %181, align 4, !tbaa !23
  %indvars.iv.next332.1 = add nsw i64 %indvars.iv331, 2
  %182 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %indvars.iv.next332.1
  store i32 1, ptr %182, align 4, !tbaa !23
  %indvars.iv.next332.2 = add nsw i64 %indvars.iv331, 3
  %183 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %indvars.iv.next332.2
  store i32 1, ptr %183, align 4, !tbaa !23
  %indvars.iv.next332.3 = add nsw i64 %indvars.iv331, 4
  %.not198.not.3 = icmp sgt i64 %93, %indvars.iv.next332.2
  br i1 %.not198.not.3, label %.lr.ph272, label %.preheader219, !llvm.loop !32

.preheader.unr-lcssa:                             ; preds = %.lr.ph275, %.lr.ph275.preheader
  %indvars.iv334.unr = phi i64 [ 1, %.lr.ph275.preheader ], [ %indvars.iv.next335.1, %.lr.ph275 ]
  %lcmp.mod359.not = icmp eq i64 %xtraiter358, 0
  br i1 %lcmp.mod359.not, label %.preheader, label %.lr.ph275.epil

.lr.ph275.epil:                                   ; preds = %.preheader.unr-lcssa
  %184 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %93, i64 %indvars.iv334.unr
  %185 = load i64, ptr %184, align 8, !tbaa !8
  %.not202.epil = icmp eq i64 %185, 0
  %186 = and i64 %indvars.iv334.unr, 1
  %.not203.epil = icmp eq i64 %186, 0
  %187 = sub nsw i64 998244353, %185
  %188 = select i1 %.not203.epil, i64 %185, i64 %187
  %189 = trunc i64 %188 to i32
  %.sink345.epil = select i1 %.not202.epil, i32 0, i32 %189
  %190 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %93, i64 %indvars.iv334.unr
  store i32 %.sink345.epil, ptr %190, align 4
  br label %.preheader

.preheader:                                       ; preds = %.preheader.unr-lcssa, %.lr.ph275.epil
  br i1 %.not199273, label %.loopexit, label %.lr.ph285

.lr.ph285:                                        ; preds = %.preheader
  %191 = trunc i64 %93 to i32
  %.0134276 = add i32 %191, -1
  %192 = sext i32 %.0134276 to i64
  %.not201277 = icmp sgt i64 %.0148.lcssa, %192
  br i1 %.not201277, label %.loopexit, label %.lr.ph281

.lr.ph275:                                        ; preds = %.lr.ph275, %.lr.ph275.preheader.new
  %indvars.iv334 = phi i64 [ 1, %.lr.ph275.preheader.new ], [ %indvars.iv.next335.1, %.lr.ph275 ]
  %niter361 = phi i64 [ 0, %.lr.ph275.preheader.new ], [ %niter361.next.1, %.lr.ph275 ]
  %193 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %93, i64 %indvars.iv334
  %194 = load i64, ptr %193, align 8, !tbaa !8
  %.not202 = icmp eq i64 %194, 0
  %195 = trunc i64 %194 to i32
  %196 = sub i32 998244353, %195
  %.sink345 = select i1 %.not202, i32 0, i32 %196
  %197 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %93, i64 %indvars.iv334
  store i32 %.sink345, ptr %197, align 4
  %indvars.iv.next335 = add nuw nsw i64 %indvars.iv334, 1
  %198 = getelementptr inbounds [2001 x [2001 x i64]], ptr @binom, i64 0, i64 %93, i64 %indvars.iv.next335
  %199 = load i64, ptr %198, align 8, !tbaa !8
  %200 = trunc i64 %199 to i32
  %201 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %93, i64 %indvars.iv.next335
  store i32 %200, ptr %201, align 4
  %indvars.iv.next335.1 = add nuw nsw i64 %indvars.iv334, 2
  %niter361.next.1 = add i64 %niter361, 2
  %niter361.ncmp.1 = icmp eq i64 %niter361.next.1, %unroll_iter360
  br i1 %niter361.ncmp.1, label %.preheader.unr-lcssa, label %.lr.ph275, !llvm.loop !33

.lr.ph281:                                        ; preds = %.lr.ph285, %._crit_edge282
  %indvars.iv338 = phi i64 [ %indvars.iv.next339, %._crit_edge282 ], [ 1, %.lr.ph285 ]
  %202 = add nsw i64 %indvars.iv338, -1
  br label %203

._crit_edge282:                                   ; preds = %203
  %indvars.iv.next339 = add nuw nsw i64 %indvars.iv338, 1
  %exitcond341 = icmp eq i64 %indvars.iv338, %93
  br i1 %exitcond341, label %.loopexit, label %.lr.ph281, !llvm.loop !34

203:                                              ; preds = %.lr.ph281, %203
  %204 = phi i64 [ %192, %.lr.ph281 ], [ %222, %203 ]
  %.0134279 = phi i32 [ %.0134276, %.lr.ph281 ], [ %.0134, %203 ]
  %.0134.in278 = phi i32 [ %191, %.lr.ph281 ], [ %.0134279, %203 ]
  %205 = sext i32 %.0134.in278 to i64
  %206 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %205, i64 %202
  %207 = load i32, ptr %206, align 4, !tbaa !23
  %208 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %205, i64 %indvars.iv338
  %209 = load i32, ptr %208, align 4, !tbaa !23
  %210 = add nsw i32 %209, %207
  %211 = sext i32 %210 to i64
  %212 = icmp sgt i32 %210, 998244352
  %213 = add nsw i64 %211, -998244353
  %spec.select217 = select i1 %212, i64 %213, i64 %211
  %214 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %204, i64 %202
  %215 = load i32, ptr %214, align 4, !tbaa !23
  %216 = sext i32 %215 to i64
  %217 = add nsw i64 %spec.select217, %216
  %218 = icmp sgt i64 %217, 998244352
  %219 = add nsw i64 %217, 3296722943
  %.1 = select i1 %218, i64 %219, i64 %217
  %220 = trunc i64 %.1 to i32
  %221 = getelementptr inbounds [2001 x [2001 x i32]], ptr getelementptr inbounds (i8, ptr @aa, i64 16016004), i64 0, i64 %204, i64 %indvars.iv338
  store i32 %220, ptr %221, align 4, !tbaa !23
  %.0134 = add i32 %.0134279, -1
  %222 = sext i32 %.0134 to i64
  %.not201 = icmp sgt i64 %.0148.lcssa, %222
  br i1 %.not201, label %._crit_edge282, label %203, !llvm.loop !35

.loopexit:                                        ; preds = %._crit_edge282, %.preheader219, %.lr.ph285, %.preheader, %._crit_edge268
  %223 = load i64, ptr %4, align 8, !tbaa !8
  %224 = load i64, ptr %5, align 8, !tbaa !8
  %225 = call noundef i64 @_Z1fxxxx(i64 noundef %94, i64 noundef %93, i64 noundef %223, i64 noundef %224)
  %226 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEx(ptr noundef nonnull align 8 dereferenceable(8) @_ZSt4cout, i64 noundef %225)
  %227 = call noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8) %226, ptr noundef nonnull @.str.1)
  br label %228

228:                                              ; preds = %.loopexit, %117
  %229 = add nuw nsw i64 %.0157286, 1
  %230 = load i64, ptr %1, align 8, !tbaa !8
  %231 = icmp slt i64 %229, %230
  br i1 %231, label %.lr.ph288, label %._crit_edge289, !llvm.loop !36
}

declare noundef zeroext i1 @_ZNSt8ios_base15sync_with_stdioEb(i1 noundef zeroext) local_unnamed_addr #3

; Function Attrs: mustprogress nounwind uwtable
declare noundef ptr @_ZNSt9basic_iosIcSt11char_traitsIcEE3tieEPSo(ptr noundef nonnull align 8 dereferenceable(264), ptr noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(16) ptr @_ZNSirsERx(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #4 align 2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef nonnull align 8 dereferenceable(8) ptr @_ZSt3maxIxERKT_S2_S2_(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc(ptr noundef nonnull align 8 dereferenceable(8), ptr noundef) local_unnamed_addr #6

; Function Attrs: mustprogress uwtable
declare noundef nonnull align 8 dereferenceable(8) ptr @_ZNSolsEx(ptr noundef nonnull align 8 dereferenceable(8), i64 noundef) local_unnamed_addr #4 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.smin.i64(i64, i64) #7

attributes #0 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress norecurse uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { inlinehint mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #7 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #8 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"vtable pointer", !7, i64 0}
!7 = !{!"Simple C++ TBAA"}
!8 = !{!9, !9, i64 0}
!9 = !{!"long long", !10, i64 0}
!10 = !{!"omnipotent char", !7, i64 0}
!11 = distinct !{!11, !12}
!12 = !{!"llvm.loop.mustprogress"}
!13 = distinct !{!13, !12}
!14 = distinct !{!14, !12, !15, !16}
!15 = !{!"llvm.loop.isvectorized", i32 1}
!16 = !{!"llvm.loop.unroll.runtime.disable"}
!17 = distinct !{!17, !12}
!18 = distinct !{!18, !12, !16, !15}
!19 = distinct !{!19, !12}
!20 = distinct !{!20, !12}
!21 = distinct !{!21, !12}
!22 = distinct !{!22, !12}
!23 = !{!24, !24, i64 0}
!24 = !{!"int", !10, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.unroll.disable"}
!27 = distinct !{!27, !12}
!28 = distinct !{!28, !12}
!29 = distinct !{!29, !12}
!30 = distinct !{!30, !12}
!31 = distinct !{!31, !26}
!32 = distinct !{!32, !12}
!33 = distinct !{!33, !12}
!34 = distinct !{!34, !12}
!35 = distinct !{!35, !12}
!36 = distinct !{!36, !12}


; Effective O3 passes: BDCEPass,DivRemPairsPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,MergedLoadStoreMotionPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass