ナショナルデーパーティのトレーニング1日目オフ2019頭の牛
// 2019年10月1日の日の練習試合
//リンクゲーム:ナショナルデーパーティのトレーニングDAY1オフ2019頭の牛
、私は家に帰る滑っ//日七日が、私はまだ良いプレーをチームメイトを促します...
//すべての後、シーンは、数日良い練習ハと一致しませんでした
全サブマトリックス
効果の対象に
サブ行列マトリックスを満たす存在するかどうかを決定する\(X_1 \ルX \ル X_2、Y_1 \ルY \ \ルY_2) 全体が、他の場所に0 1です。
水の問題は、暴力的なことができるかを決定します。
ACコード
#include<iostream>
#include<cstdio>
using namespace std;
char mat[15][15];
int n, m;
int x1, y1, x2, y2;
void check() {
for(int i=x1;i<=x2;i++) {
for(int j=y1;j<=y2;j++) {
if(mat[i][j]=='1') {
mat[i][j] = '0';
}else {
printf("No\n");
return;
}
}
}
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
if(mat[i][j]=='1') {
printf("No\n");
return;
}
}
}
printf("Yes\n");
}
int main() {
while(scanf("%d %d", &n, &m)!=EOF) {
for(int i=0;i<n;i++)
scanf("%s", mat[i]);
x1 = y1 = x2 = y2 = -1;
for(int i=0;i<n&&x1==-1;i++) {
for(int j=0;j<m;j++) {
if(mat[i][j]=='1') {
x1 = i, y1 = j;
break;
}
}
}
for(int i=n-1;i>=0&&x2==-1;i--) {
for(int j=m-1;j>=0;j--) {
if(mat[i][j]=='1') {
x2 = i, y2 = j;
break;
}
}
}
if(x1==-1||x2==-1) {
printf("No\n");
continue;
}
check();
}
return 0;
}
組合せのBの数
効果の対象に
所与のn及びk、検索\(MIN(C_N ^ K、18は10 ^ {})\) 。
\(0≤K≤N≤10 9 ^ \) 、アップ\(10 ^ 5 \)データのセット。
考え
組み合わせの数\(C_ {100} ^ { 50} \) はるか超えた\(10 ^ {18} \) 、その後明らかにも、組み合わせの数を見つける再帰のO(n)を用いて検討し\(^ 5 10 \)データのセットは、過去に走りました。
再び再帰の数の組み合わせをおさらいするには
\ [C_N ^ K = \ FRAC {N-K + 1}、{K} C_N ^ {K-1} \]
ACコード
A長い時間前に投げる、注意\(^ {C_N C_N NK} = ^ K \) 、最初のk =分(K、NK) 、プロセスは単調であることを保証するために計算されます。
double
過去、だけでなく、無敵を使用します__int128
。試合後見つけることができるlong double
精度を確保します。
#include<cstdio>
using namespace std;
typedef long long ll;
//typedef __int128 i128;
const ll INF = 1e18;
ll cal(ll n, ll k) {
if(k>n/2) k = n - k;
// i128 res = 1;
long double res = 1.0;
for(ll i=1;i<=k;i++) {
res = res*(n-i+1)/i;
if(res>INF) return INF;
}
return (ll)res;
}
int main() {
ll n, k;
while(scanf("%lld %lld", &n, &k)!=EOF) {
printf("%lld\n", cal(n, k));
}
return 0;
}
書かれたPythonのエレガントなシンプル:
while True:
try:
n, k = map(int, input().split())
k = min(k, n-k)
ans = 1
for i in range(1, k+1):
ans = ans * (n-i+1) // i
if ans>10**18 :
ans = 10**18
break
print(ans)
except EOFError:
break
E番号
効果の対象に
そこ範囲をN [0、99]の整数であり、そして今、彼らは元の配列の数はどのように多くの可能性を聞いて書いて接続されています。
考え
思想は、間違った半書かれたDPで、DFSを書き換えたサンプルのない発作、彼は下落しました。。。
//元は、DFSでpos==len
のみ++ ANS。
ACコード
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char s[55];
bool vis[100];
int len;
int ans;
void dfs(int pos) {
if(pos>len) return;
if(pos==len) {
++ans;
return;
}
int n = s[pos]-'0';
int nn = n*10;
if(!vis[n]) {
vis[n] = 1;
dfs(pos+1);
vis[n] = 0;
}
if(nn && pos<len-1) nn += s[pos+1]-'0';
if(nn>=10 && !vis[nn]) {
vis[nn] = 1;
dfs(pos+2);
vis[nn] = 0;
}
}
int main() {
while(scanf("%s", s)!=EOF) {
memset(vis, 0, sizeof(vis));
len = strlen(s);
ans = 0;
dfs(0);
printf("%d\n", ans);
}
return 0;
}
F 4ボタン
効果の対象に
右へステップアップが移動すると、上方への移動工程b、最も左にステップcが移動する、工程dの最大下降まで:ボボは、平面上の原点(0,0)から始まる4つの動作があります。Q n回異なる動作点の数が到達することができます。
考え
唯一の操作は非常に簡単なステップであり、それぞれ、あなたは離れて、原点(0)、(0、B)、(-c、0)、(0、-d)から座標軸に到達することができます。これは、1つの+ A + B + C + Dポイントの合計を含む起点を含みます。
マルチステップは、まず第一象限の状況を見てみましょう。
最初の操作はX軸間隔到達[1、A]、垂直方向にn番目に2 [1を、(N-1)B)]に到達し、*の合計(N-1)番目のBポイント;
二つのX軸動作が区間[A + 1、図2(a)]、n番目の垂直方向に2番目に到達する[1、(N-2)B)] *(N-2の合計)Bに到達しますポイント;
···
N-1の動作は、最初のn 1番目のn番目の垂直方向に到達するために、x軸間隔[(N-2)は、A + 1、(N-1)A]を到達[1、B]の合計//二点* Bと、
小数点演算// N [(N-1)A + 1、NA]遠いx軸に達します。
だから、答えは、1 + N(A + B + C + D)+ n(nは-1)/ 2 *(AB + BC + CD +広告)簡単です。
ACコード
#include<cstdio>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
ll n, a, b, c, d;
int main() {
while(scanf("%lld %lld %lld %lld %lld", &n, &a, &b, &c, &d)!=EOF) {
ll ans = 1 + (a+b+c+d)%mod * n%mod + n*(n-1)/2 %mod
*((a*b%mod+ b*c%mod + c*d%mod + a*d%mod)%mod)%mod;
printf("%lld\n", ans%mod);
}
return 0;
}
有向グラフH
効果の対象に
数学は、私の鍋を完成させます。