您的位置:首页 > 其它

srm537 div1

2012-04-03 03:33 344 查看
250pt

给定A,B,X

求pA+qB = tX+kY,p,q,t,k >= 0中Y的个数。

首先考虑什么时候y有无穷多解,很显然此时k取0,因此X|A && X|B

可以观察出在这个等式中,有两个基本解,既A = tX+kY与B = tX+kY,于是问题转化为,我们对于给定的X,求出同时满足这两个等式的Y的个数。

显然,如果Y有有限个取值,那么Y <= MAX(A,B).

bool can(int A,int B,int X,int Y)
{
bool flag1 = false,flag2 = false;
for(int i = 0;i * X <= A;i++)
if((A - i*X) % Y == 0) flag1 = true;
for(int i = 0;i * X <= B;i++)
if((B-i*X) % Y == 0) flag2 = true;
return flag1 && flag2;
}
int howMany(int A, int B, int X)
{
int ans = 0;
if(A % X == 0 && B % X == 0) return -1;
int t = A > B?A:B;
for(int i = 1;i <= t;i++)
{
if(can(A,B,X,i))
ans++;
}
return ans;
}


500pt

有一个重要的观察:每一bit的期望是独立事件,也就是说,我们只需要计算每一bit最终为1的概率是多少即可,最后的解就是每一位的期望之和。

求每一位最终为1的概率可以dp.

double expectedNumber(vector <int> ducks, vector <int> spellOne, vector <int> spellTwo, int K)
{
//$CARETPOSITION$
double dp[55][55];
double ans = 0;
for(int mask = 1;mask <= 1000000000;mask *=2)
{
memset(dp,0,sizeof dp);
for(int j = 0;j < ducks.size();j++)
dp[0][j] = (ducks[j] & mask) !=0 ? 1 : 0;
for(int i = 0;i < K;i++)
for(int j = 0;j < ducks.size();j++)
{
if((spellOne[j] & mask) == 0)
dp[i+1][j] += 0.5*dp[i][j];
else dp[i+1][j] += 0.5*(1-dp[i][j]);
dp[i+1][spellTwo[j]] += 0.5*dp[i][j];
}
ans += mask*dp[K][0];
//printf("%lf\n",ans);
}
return ans;
}


925pt

目测网络流,还没想出来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: