結果
| 問題 | No.3506 All Distance is Square Number |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 02:44:41 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 17 ms / 2,000 ms |
| コード長 | 3,735 bytes |
| 記録 | |
| コンパイル時間 | 1,966 ms |
| コンパイル使用メモリ | 273,356 KB |
| 実行使用メモリ | 16,256 KB |
| 最終ジャッジ日時 | 2026-04-18 02:44:46 |
| 合計ジャッジ時間 | 3,850 ms |
|
ジャッジサーバーID (参考情報) |
judge3_0 / judge1_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 29 |
コンパイルメッセージ
main.cpp: In function 'void initcatalan(long long int)':
main.cpp:85:59: warning: iteration 1000002 invokes undefined behavior [-Waggressive-loop-optimizations]
85 | for (int i=1; i<CATALANMAX; ++i)cat[i]=(((fact[2*i]*invfact[i])%MOD)*invfact[i+1])%MOD;
| ~~~~~~~~^
main.cpp:85:24: note: within this loop
85 | for (int i=1; i<CATALANMAX; ++i)cat[i]=(((fact[2*i]*invfact[i])%MOD)*invfact[i+1])%MOD;
| ~^~~~~~~~~~~
ソースコード
#include <cstdio>
#include <stdio.h>
#include <stdbool.h>
#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
#include <numeric>
#include <cassert>
#include <random>
#include <chrono>
#include <fstream>
using namespace std;
#define int long long
#define mp make_pair
#define pii pair<int, int>
#define fi first
#define se second
#define pb push_back
const int MOD = 998244353;//
const int FACTMAX = 2000005;//
const int CATALANMAX = 1000005;//
int fact[FACTMAX], invfact[FACTMAX], cat[CATALANMAX];
int expo(int a, int b){
int res=1;
a%=MOD;
while (b){
if (b&1)res=(res*a)%MOD;
a=(a*a)%MOD;
b>>=1;
}
return res;
}
int inv(int num){
return expo(num, MOD-2);
}
void initfact(){
fact[0]=1;
for (int i=1; i<FACTMAX; ++i)fact[i]=(fact[i-1]*i)%MOD;
invfact[FACTMAX-1]=inv(fact[FACTMAX-1]);
for (int i=FACTMAX-2; i>=0; --i)invfact[i]=(invfact[i+1]*(i+1))%MOD;
}
int ncr(int n, int r){
if (n<r||r<0)return 0;
return (((fact[n]*invfact[r])%MOD)*invfact[n-r])%MOD;
}
int gcd(int a, int b){
while (b){
int t=a%b;
a=b;
b=t;
}
return a;
}
int lcm(int a, int b){
int temp=gcd(a, b);
a/=temp;
b/=temp;
return a*b*temp;
}
void initcatalan(int k){
cat[0]=1;
for (int i=1; i<CATALANMAX; ++i)cat[i]=(((fact[2*i]*invfact[i])%MOD)*invfact[i+1])%MOD;
}
const int smax=20000;
bitset<smax+1> dp[105][105];
int a[105]={
0,0,
1,3,33,16,64,152,120,144,112,84,60,129,156,4,132,168,76,68,
24,188,136,36,8,92,160,184,31,124,128,35,177,185,147,167,193,
187,73,27,55,126,41,146,25,29,83,189,191,155,79,171,174,173,
70,71,197,172,198,176,151,159,183,170,130,162,80,175,165,186,
199,133,182,169,180,181,190,103,93,166,161,111,98,86,122,178,
157,179,148,143,113,154,127,135,141,149,153,139,138,163,150
};
int b[105]={
0,0,0,
15,48,192,121,105,104,119,195,137,200,40,96,196,49,12,51,28,
9,116,20,140,72,56,52,17,32,19,5,45,23,7,13,21,6,11,2,18,
194,14,100,10,37,43,39,26,22,34,53,44,47,57,30,46,38,54,61,
63,58,42,62,59,69,50,67,89,65,75,66,74,81,77,87,85,78,82,
91,101,88,95,94,90,97,99,107,106,115,109,114,110,102,108,117,
134,125,118,142,123,158
};
int e1[105], e2[105], u[205], v[205], c[205], sq[150], sc;
vector<int> get(int l, int r, int s){
if (l+1==r){
if (s==a[r])return {e1[r]};
vector<int> q=get(r-2, r-1, s-b[r]);
reverse(q.begin(), q.end());
q.pb(e2[r]);
return q;
}
if (l==r-2){
if (s==b[r])return {e2[r]};
vector<int> q=get(l, r-1, s-a[r]);
q.pb(e1[r]);
return q;
}
if (s>=a[r]&&dp[l][r-1][s-a[r]]){
vector<int> q=get(l, r-1, s-a[r]);
q.pb(e1[r]);
return q;
}
vector<int> q=get(l, r-2, s-b[r]);
q.pb(e2[r]);
return q;
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t=1;
//cin>>t;
while (t--){
int n;
cin>>n;
for (int i=0; i*i<=smax; ++i)sq[sc++]=i*i;
int m=0;
u[++m]=1; v[m]=2; c[m]=a[2]; e1[2]=m;
for (int i=3; i<=n; ++i){
u[++m]=i-2; v[m]=i; c[m]=b[i]; e2[i]=m;
u[++m]=i-1; v[m]=i; c[m]=a[i]; e1[i]=m;
}
cout<<m<<"\n";
for (int i=1; i<=m; ++i)cout<<u[i]<<" "<<v[i]<<" "<<c[i]<<"\n";
dp[1][2][a[2]]=1;
for (int r=3; r<=n; ++r){
for (int l=1; l<=r-3; ++l)dp[l][r]=(dp[l][r-2]<<b[r])|(dp[l][r-1]<<a[r]);
dp[r-2][r][b[r]]=1;
dp[r-2][r]|=dp[r-2][r-1]<<a[r];
dp[r-1][r][a[r]]=1;
dp[r-1][r]|=dp[r-2][r-1]<<b[r];
}
for (int l=1; l<=n; ++l){
for (int r=l+1; r<=n; ++r){
int s=0;
while (!dp[l][r][sq[s]])++s;
vector<int> q=get(l, r, sq[s]);
cout<<q.size();
for (int x:q)cout<<" "<<x;
cout<<"\n";
}
}
}
}