hdu 4873 ZCC Loves Intersection(大数+概率)
发布时间:2020-12-14 03:28:22 所属栏目:大数据 来源:网络整理
导读:题目链接:hdu 4873 ZCC Loves Intersection 题目大意:给出N,D,表示在一个D维的坐标上,坐标范围为0~N-1。在这个坐标系中有D条线段,分别平行与各个坐标轴,每秒会根据题目中的伪代码随机生成各个线段的位置。两条直线相交的话会得一分,问每秒得分的期望
题目链接:hdu 4873 ZCC Loves Intersection 题目大意:给出N,D,表示在一个D维的坐标上,坐标范围为0~N-1。在这个坐标系中有D条线段,分别平行与各个坐标轴,每秒会根据题目中的伪代码随机生成各个线段的位置。两条直线相交的话会得一分,问每秒得分的期望。 解题思路:总的情况(ND?1?C(2N))D,两条直线相交的得分CD)?s2?2?())2 #include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
const int MAXN = 10005;
struct bign {
int len,num[MAXN];
bign () {
len = 0;
memset(num,0,sizeof(num));
}
bign (int number) {*this = number;}
bign (char* number) {*this = number;}
void DelZero ();
void Put ();
void operator = (int number);
char* number);
bool operator < (const bign& b) const;
operator > (const { return b < *this; }
operator <= (return !(b < *this); }
operator >= (return !(*this < b); }
operator != (this || *this < b;}
operator == (return !(b != *this); }
operator ++ ();
operator -- ();
bign operator + (int& b);
bign const bign& b);
bign operator - (operator * (operator / (int& b);
//bign operator / (const bign& b);
int operator % (int& b);
};
/*Code*/
int maxn = 5000;
int cnt,num[maxn];
void divfact (int n) {
int m = (int)sqrt(n + 0.5);
for (int i = 2; i <= m; i++) {
if (n % i)
continue;
num[cnt++] = i;
while (n % i == 0)
n /= i;
}
if (n != 1)
num[cnt++] = n;
}
bign power (bign x,114)">int d) {
bign ans = 1;
while (d) {
if (d & 1)
ans = ans * x;
x = x * x;
d /= 2;
}
return ans;
}
int main () {
int N,D;
while (scanf("%d%d",&N,&D) == 2 && N + D) {
cnt = 0;
bign q = N;
q = power(q,D) * 9;
bign p = D * (D - 1) / 2;
p = p * (N + 4);
p = p * (N + 4);
divfact(N);
num[cnt++] = 3;
0; i < cnt; i++) {
while (p % num[i] == 0 && q % num[i] == 0) {
p = p / num[i];
q = q / num[i];
}
}
if (p != q) {
p.Put();
printf("/");
q.Put();
} else
"1");
"n");
}
return 0;
}
void bign::DelZero () {
while (len && num[len-1] == 0)
len--;
if (len == 0) {
num[len++] = 0;
}
}
void bign::Put () {
int i = len-1; i >= 0; i--)
"%d",num[i]);
}
void bign::char* number) {
len = strlen (number);
0; i < len; i++)
num[i] = number[len-i-1] - '0';
DelZero ();
}
int number) {
len = 0;
while (number) {
num[len++] = number%10;
number /= 10;
}
DelZero ();
}
bool bign::operator < (const {
if (len != b.len)
return len < b.len;
0; i--)
if (num[i] != b.num[i])
return num[i] < b.num[i];
return false;
}
operator ++ () {
int s = 1;
0; i < len; i++) {
s = s + num[i];
num[i] = s % 10;
s /= 10;
if (!s) break;
}
while (s) {
num[len++] = s%10;
}
}
operator -- () {
if (num[0] == 0 && len == 1) return;
int s = -0; i < len; i++) {
s = s + num[i];
num[i] = (s + 10) % if (s >= 0) break;
}
DelZero ();
}
bign bign::int& b) {
bign a = b;
return *this + a;
}
bign bign::const bign& b) {
int bignSum = 0;
bign ans;
0; i < len || i < b.len; i++) {
if (i < len) bignSum += num[i];
if (i < b.len) bignSum += b.num[i];
ans.num[ans.len++] = bignSum % 10;
bignSum /= 10;
}
while (bignSum) {
ans.num[ans.len++] = bignSum % return ans;
}
bign bign::this - a;
}
bign bign::int bignSub = 0;
bign ans;
0; i < len || i < b.len; i++) {
bignSub += num[i];
bignSub -= b.num[i];
ans.num[ans.len++] = (bignSub + if (bignSub < 0) bignSub = -1;
}
ans.DelZero ();
int& b) {
long long bignSum = 0;
bign ans;
ans.len = len;
0; i < len; i++) {
bignSum += (long)num[i] * b;
ans.num[i] = bignSum % const bign& b) {
bign ans;
ans.len = 0;
0; i < len; i++){
0;
int j = 0; j < b.len; j++){
bignSum += num[i] * b.num[j] + ans.num[i+j];
ans.num[i+j] = bignSum % 10;
bignSum /= 10;
}
ans.len = i + b.len;
while (bignSum){
ans.num[ans.len++] = bignSum % 10;
}
}
int& b) {
bign ans;
0; i--) {
s = s * 10 + num[i];
ans.num[i] = s/b;
s %= b;
}
ans.len = len;
ans.DelZero ();
int bign::10 + num[i];
ans.num[i] = s/b;
s %= b;
}
return s;
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |