srm 537

275



Description

給定A,B,X200 ,讓你求出有多少個Y 滿足Xi+Yj 可以表示所有的Ap+Bq

Solution

首先如果XAB 的約數的話,顯然Y是無窮多個,否則我們可以暴力枚舉Y ,判斷XY 的線性組合是否可以表示AB ,如果可以的話答案+1。

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
int a, b;
int v[205];
bool check(int x, int y, int num) {
    if (num == a || num == b)   memset(v, -1, sizeof(v));
    if (!num)   return 1;
    if (num < 0)    return 0;
    int &t = v[num];
    if (~t)    return t;
    t = check(x, y, num - x) | check(x, y, num - y);
    return t;
}
class KingXNewCurrency {
        public:
        int howMany(int A, int B, int X) {
            int ans = 0;
            a = A, b = B;
            if (a % X == 0 && b % X == 0)   ans = -1;
            else {
                for (int i = 1; i <= 200; ++i) {
                    if (check(X, i, a) && check(X, i, b))   ++ans;
                }
            }
            return ans;
        }
};

500



Description:

總共有K 天,n 個數,每個數初始給定。每天可以進行兩種操作

  • (1)把第i 個數和spellOne[i] 異或
  • (2)把第i 個數置換爲第spellTwo[i] 個數

K 天后第一個房間數字的期望

Solution

考慮dp,很容易看出每個二進制位都是獨立的,按位進行dp即可。dp[i][j][k] 表示到了第i 天,第j 個數,當前爲k時的期望。轉移很簡單。
dp[i][j][k ^ (spellOne[j]>>mask & 1)] +=dp[i1][j][k]0.5
dp[i][spellTwo[j]][k]+=dp[i1][j][k]0.5 ,統計即可

Code:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int N = 55;
double dp[N][N][2];
class KingXMagicSpells {
    public:
        double expectedNumber(vector <int> ducks, vector <int> spellOne, vector <int> spellTwo, int K) {
            int n = ducks.size();
            double ans = 0.0;
            for (int mask = 0; mask <= 30; ++mask) {
                memset(dp, 0, sizeof(dp));
                for (int i = 1; i <= n; ++i)    dp[0][i][ducks[i - 1] >> mask & 1] = 1.0;
                for (int i = 1; i <= K; ++i)
                    for (int j = 1; j <= n; ++j) 
                        for (int k = 0; k < 2; ++k) {
                            dp[i][j][k ^ (spellOne[j - 1] >> mask & 1)] += dp[i - 1][j][k] * 0.5;
                            dp[i][spellTwo[j - 1] + 1][k] += dp[i - 1][j][k] * 0.5;
                        }
                ans += dp[K][1][1] * (1 << mask);
            }
            return ans;
        }
};
發佈了86 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章