問題のナショナルトレーニング1日目・ソリューション
T1分割
質問の意味:
そこ\(N- \)番号は\(A_1、A_2、...、 A_N \) 数mの持っている\(B_1、B_2、...、B_N \を)
令\(= A_1回\ A_2 \、\回... \回\、A_N \)
令\(B = B_1回\ \、B_2回\ \、... \、\回\、B_N \)
解析\(\)か\(Bの\)複数
入力:\(N-、M \)
出力:\(はい/いいえ\)
実践:シンプルなの素因数分解があります
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, m;
int a[1010], b[1010];
int p[3][20]={};
void divid(int op, int x)
{
if(x == 1) return;
if(x == 2) p[op][1]++;
if(x == 3) p[op][2]++;
if(x == 4) p[op][1] += 2;
if(x == 5) p[op][3]++;
if(x == 6) {p[op][1]++; p[op][2]++;}
return;
}
int main()
{
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
divid(1, a[i]);
}
for(int i = 1; i <= m; i++)
{
scanf("%d", &b[i]);
divid(2, b[i]);
}
for(int i = 1; i <= 3; i++)
{
if(p[1][i] >= p[2][i])continue;
else
{
printf("No\n"); return 0;
}
}
printf("Yes\n");
return 0;
}
/*
样例:
输入:2 3
6 6
1 3 4
输出:Yes
*/
T2グラフ
質問の意味:
生成nは今有向グラフをポイントに。要件が満たされています:
1.もし\(A-> B \)側面がある(B-> \)\エッジ
2.場合\(A-> B \)側と\(B-> C \)側は、ある\(A-> C \)エッジ
3.少なくとも1点なしのループバック
いくつかのプログラムを検索します。その結果、結果として大きくてもよい\(m個\)モジュロ
入力:\(N-、M \)
出力:答え
実践:
この質問は、比較的外のピットに加えて、問題の意味で、それは多くの困難を持っていません。通信ブロックサイズが2以上である点は、点は自己ループを有していなければならない場合、質問の意味に従って、なお。
私のアプローチがある:う\([I] [0 fは \]) を表し\(Iは\)自由に組み合わせ点、及び各点ループバックのいくつかの解決策が存在するが
\([1 [I] F \]) を表し\(Iは\)自由に少なくともと組み合わせた点\(1 \)ループバックせずにプログラム番号のポイントを
私はやや独特の方程式を転送する方法は、私が見ていた\(1 \)ドットの通信ブロックの転送が議論されることに注意することが転送されたポイント数\(1 \)号点を点として単離されると単離された場合、存在する(1 \)\環からドット、および2例のループではないが、別々に議論する必要は次のように、状態遷移方程式は、次のとおり
\([I] [1 F ] + = F [I - 1] [1] \ \ \ \、1 \) ドットおよび単離さ\(1 \)ドットループバックが存在します
\(F [i]が[1 ] + = F [I - 1] [1] + Fの[I - 1] [0] \ \ \ \、1 \) ドットを単離し、(\ 1)\特許ループバックポイントが存在しない場合、他の点がループバックできる、ループバックではないかもしれません
\([I] [1 F F] + = \ sum_ {J = 2} ^ {I} [I - J] [1]回\ C_ {I-1} ^ {J-1} \ \ \ 、\、\)算出される\(1 \)のようなポイントの通信ブロックサイズの数\(J \)方式の数
\(F [i]が[0 ] + = [I-1] [0] \ \ \ \、1 \ f)にのみループから単離することができる場合に点数
\([I] [0 F F] + = \ sum_ {J = 2} ^ {I} [I - J] [0]回\ C_ {I-1} ^ {J-1} \ \ \ 、\、\)算出される\(1 \)のようなポイントの通信ブロックサイズの数\(J \)方式の数
その上に番号とパスカルの三角形の組み合わせ。
教師の実践は、「第1です\(1 \)ポイント」を「最初の\(私は\)ポイント」、実際には、言葉遣いは同じですが、考え方は異なっています。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 2010
#define ll long long
int n, mol;
ll f[maxn][2];// 1:符合题意 0:不符合题意
ll C[maxn][maxn];
int main()
{
freopen("graph.in", "r", stdin);
freopen("graph.out", "w", stdout);
scanf("%d%d", &n, &mol);
for(int i = 0; i <= n; i++) C[i][0] = 1;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mol;
}
}
/* for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= i; j++)
printf("C[%d][%d] = %lld ", i, j, C[i][j]);
printf("\n");
}
*/
f[1][1] = 1; f[1][0] = 1;
for(int i = 2; i <= n; i++)
{
f[i][1] = (f[i][1] + f[i - 1][1] + f[i - 1][0] + f[i - 1][1]) % mol;
f[i][0] = (f[i][0] + f[i - 1][0]) % mol;
for(int j = 2; j < i; j++)
{
// f[i][1] = (f[i][1] + ( ( ( (C[i - 1][j - 1] * S[j - 1][j - 1]) % mol ) * ( (f[i - j][0] + f[i - j][1]) % mol) ) % mol)) % mol;
f[i][1] = (f[i][1] + (C[i - 1][j - 1] * f[i - j][1]) % mol) % mol;
f[i][0] = (f[i][0] + (C[i - 1][j - 1] * f[i - j][0]) % mol) % mol;
}
f[i][0] = (f[i][0] + 1) % mol;
}
// for(int i = 1; i <= n; i++)
// printf("f[%d][0] = %lld f[%d][1] = %lld\n", i, f[i][0], i, f[i][1]);
printf("%lld\n", f[n][1]);
return 0;
}
/*
样例:
输入:2 5
输出:3
*/