53回の練習オフ牛(更新します)
トピックリンク:リンク
姉妹校を超えた愛の文字列
問題の意味:長さNの文字列、唯一のC、Yの文字列の連続とC.できません
アイデア:実際にはDP、\(DP [I] [C]は\)の長さを表し、\を(私は\)するために、(C \)\種の列番号の末尾に。:全体の状態方程式有する
\ [DP [I] [C] = Dpを[-I 1] [Y] \\ Dpを[I] [Y] = Dpを[-I 1] [C] + Dpの[I-します。 1] [Y] \]
のみという事実にフィボナッチ列を検索します。
コード:
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
const ULL MOD = 1000000000 + 7;
const int maxn = 100000 + 13;
ULL Dp[maxn][2];
void Init() {
// 0 --> Y, 1 ---> C
memset(Dp, 0, sizeof(Dp));
Dp[0][0] = Dp[0][1] = 0;
Dp[1][0] = Dp[1][1] = 1;
for(int i = 2; i < maxn; ++i) {
Dp[i][0] = (Dp[i-1][0] + Dp[i-1][1]) % MOD;
Dp[i][1] = Dp[i-1][0];
}
}
int main() {
Init();
int n;
while(scanf("%d", &n) != EOF) {
ULL sum = (Dp[n][0] + Dp[n][1]) % MOD;
printf("%lld\n", sum);
}
return 0;
}
Bおいしいゼリー
問題の意味:$ \ sum_ {i = 1 } ^ {n}は\ sum_ {J = 1} ^ {I} {i *が[\ FRAC {I} {J}] ^ {jは}} $ の質問の簡単な暴力の意味を。。。
考える:この質問は法律を見つけることです。。。書かれた具体的な計算式は、定期的に見つかりました。次のように:
。\ [\ \\ 1 ^ 2 1 \\&2 ^ 2 \ \ 2 *&{左=整列}開始・3 ^ 2 \ \ 3 * 1 ^ 2 \ \ 3 * 1 ^ 3 \\&4 ^ 2 \ \ 4。。。。。。。。 * ^ 2 2 \ \ 4 * ^ 3 1 \ \ 4 * 1 ^ 4 \\&\ cdots \\&N ^ 2 \ \ N * [\ FRAC {n}は{2}] ^ 2 \ \ N * [\ FRAC {N} {3}]
^ 3 \ cdots N * 1 \エンドN ^ \] {整列} 最初の列である\(\ sum_i ^のNi ^ 2 \) 、最初の\(J \)の列は、開始します中([\ FRAC {N} \ {J}] \) 遮断します。
コード:
int main() {
false_stdio;
cin >> n;
for (ll j = 1; j <= n; j++) {
num[j] = j;
ans = (ans + j * j % mod) % mod;
}
for (ll j = 2; j <= n; j++) {
cnt = n / j;
ll L = j;
for (int i = 1; i < cnt; i++) {
tot = (L * j + (j * (j - 1) >>1)) % mod;
num[i] = num[i] * i % mod;
ans = ans + tot * num[i] % mod;
L += j;
}
num[cnt] = num[cnt] * cnt % mod;
tot = (n - cnt * j + 1) % mod;
ans =ans+ (L * tot % mod + (tot * (tot - 1)>>1)) % mod * num[cnt] % mod;
}
ans = (ans + mod) % mod;
cout << ans << endl;
return 0;
}
ケイ一致文字列リーガル
質問の意味:0-1文字列マッチング、「_」をどのように多くの成功したマッチのワイルドカード、出力を表しています。
アイデア:あなたはこのビットセット質問を行うために使用できるように、文字列は、0-1ですので。操作が一致するか否かに応じて、対応するビットに等しいです。
コード:
int cnt = 0;
bitset<1005> p;
bitset<1005> q;
cin >> str;
for(int j = 0; j < m; ++j) {
char c = str[j];
if(c == '0') {
q[j] = 0; p[j] = 1;
} else if(c == '1') {
p[j] = q[j] = 1;
} else if(c == '_') {
p[j] = q[j] = 0;
}
}
for(int i = 0; i < n; ++i) {
if((p&Str[i]) == q) cnt ++;
}
cout << cnt << endl;