【51nod】3145 扔球游戏 扔球游戏Link解题思路考虑每一位上的期望为:nn+m×mn+m−1\frac{n}{n+m}\times\frac{m}{n+m-1}n+mn×n+m−1m ,一共有 n+m−1n+m-1n+m−1 位,所以 ans=nmn+mans=\frac{nm}{n+m}ans=n+mnm 。code#include<iostream>#include<cstdio>using namespace std;int n,m;int gcd(int x,int
【51nod】1632 B君的连通 B君的连通Link题目大意B国拥有n个城市,其交通系统呈树状结构,即任意两个城市存在且仅存在一条交通线将其连接。A国是B国的敌国企图秘密发射导弹打击B国的交通线,现假设每条交通线都有50%的概率被炸毁,B国希望知道在被炸毁之后,剩下联通块的个数的期望是多少?解题思路因为这是一棵树,所以每炸断一条路就会多一个连通块,所以期望为12(n−1)+1\frac{1}{2}(n-1)+121(n−1)+1 ,再乘上2n−12^{n-1}2n−1 即可。code#include<iostrea
【51nod】1639 绑鞋带 绑鞋带Link题目描述有n根鞋带混在一起,现在重复n次以下操作:随机抽出两个鞋带头,把它们绑在一起。可以想象,这n次之后將不再有单独的鞋带头,n条鞋带系成了一些环。那么有多大概率刚好所有这些鞋带只形成了一个环?解题思路code#include<iostream>#include<cstdio>using namespace std;int n;double ans=1;int main(){ cin>>n; for(int i=2*n-
【51nod】1381 硬币游戏 硬币游戏Link解题思路所有情况都可以平移为与平行线相切的情况,则期望为 2n2n2n 。若硬币上下都与平行线相切,那么期望为 2n+12n+12n+1 。但是相切的情况概率太小,所以忽略不计。所以期望为 2n2n2n 。code#include<iostream>#include<cstdio>using namespace std;int T;int r;int main(){ cin>>T; while(T--) { s
【POJ】1845 Sumdiv SumdivLink解题思路显然,aba^bab 的分解质因数就是 aaa 的分解质因数数量每个乘以 bbb 。求和直接用等比数列求和公式即可。code#include<iostream>#include<cstdio>#include<cmath>#define int long longusing namespace std;const int mod=9901;int a,b,ans;int x[10000],y[10000],to
【51nod】3210 二进制统计 二进制统计Link解题思路暴力统计即可。code#include<iostream>#include<cstdio>using namespace std;int n;int ans[40]; int count(int t){ int s=0; while(!(t&1)) s++,t>>=1; return s;}int main(){ cin>>n; for(int i=1;i<=n;i++
【51nod】2527 Or 和 Sum Or 和 SumLinkcode#include<iostream>#include<cstdio>#define int long longusing namespace std;int a,b,c;signed main(){ cin>>a>>b; c=b-a; if(a>b) printf("Impossible"); else if((a&c)==c) printf("Possible"
【51nod】3395 n位格雷码 n位格雷码Link解题思路若某一位上数字和上一位相等,那这一位就是 111 ,否则是 000 ,就可以用亦或来做。code#include<iostream>#include<cstdio>#define int long longusing namespace std;int n;void output(int x){ int a[20],tot=0; while(x) a[++tot]=x%2,x>>=1; for(int i=n;
【51nod】2106 一个奇数次 一个奇数次Link解题思路如果一个数被亦或两次,那么相当于没有亦或。数据中只有一个出现奇数次的数,所以把所有数亦或一遍,结果就是奇数次的数。code#include<iostream>#include<cstdio>using namespace std;int n,ans;int main(){ cin>>n; for(int i=1;i<=n;i++) { int t; scanf("%d",&t); an
【51nod】3216 授勋 授勋Link解题思路二进制拆分。code#include<iostream>#include<cstdio>using namespace std;int n;int main(){ cin>>n; while(n--) { int a,ans=0; scanf("%d",&a); while(a) { ans+=a&1; a>>=1; } printf("%d",ans