码迷,mamicode.com
首页 > 其他好文 > 详细

srm 537

时间:2015-06-15 22:10:52      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

275



Description

给定A,B,X200,让你求出有多少个Y满足X?i+Y?j可以表示所有的A?p+B?q

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[i?1][j][k]?0.5
dp[i][spellTwo[j]][k]+=dp[i?1][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;
        }
};

srm 537

标签:

原文地址:http://blog.csdn.net/mlzmlz95/article/details/46508017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!