33,007
社区成员
发帖
与我相关
我的任务
分享
BOOL CSpgTestQuick::GetFindCount(int a, int b, int &nCount)
{
int m, n, c1, c2, l, r;
m = max(a, b);
n = min(a, b);
if(m == 1 && n == 1)
{
nCount = 0;
return TRUE;
}
l = m/2;
r = m-l;
GetFindCount(l, n, c1);
GetFindCount(r, n, c2);
nCount = 2+c1+c2;
return TRUE;
}
BOOL CSpgTestQuick::GetTestCount(int a, int b, int &nCount)
{
int c1, c2, c3, l, r;
if(a==1 && b==1)
{
nCount = 1;
return TRUE;
}
GetFindCount(a, b, c1);
c2 = 0;
if(a>1)
{
l = a/2;
r = a-l;
GetTestCount(l, r, c2);
}
c3 = 0;
if(b>1)
{
l = b/2;
r = b-l;
GetTestCount(l, r, c3);
}
nCount = 1+c1+c2+c3;
return TRUE;
}
f2(a+b,c+d) = 1 + f1(a+b, c+d) + f2(a,b) + f2(c+d)
f2(a+b,c+d) = 1 + 2*a*b-2 + f2(a,b) + f2(c+d)
a b f2(a,b)
1 1 1
2 2 1 + 1*2 + f1(2,2)
4 4 1 + 2 + 4 + f1(4,4) + 2*f1(2,2)
8 8 1 + 2 + 4 + 8 + f1(8,8) + 2*f1(4,4) + 4*f1(2,2)
n n 1 + 2 + 4 + ...+ n + f1(n, n) + 2*f1(n/2, n/2) + ... n/2*f1(2,2)
n*2-1 + ???
f(a+b,c) = 2 + f(a,c) + f(b,c)
1 1 0
1 2 2 2
1 4 6 2+2*2
1 8 16 2+2*2+2*2*2 = 2^4-2
n = log(x)/log(2)
f(1,x) = 2^(n+1)-2 = x-1
f(1,x) = 2x-2
f(x,1) = 2x-2
1 1 0 2-2 0
1 2 2 4-2
2 2 2+2*2 8-2 1 3
2 4 2+4+8 16-2
4 4 2+4+8+16 32-2 2 5
4 8 2+4+8+16+32 64-2
8 8 2+4+8+16+32+64 128-2 3 7
n = log(x)/log(2)
f(x,x) = 2^(2n+1)-2 = 2^(2*log(x)/log(2)+1)-2 = 2*x*x-2
猜测
f1(a,b) = 2*a*b-2
验证代入
f(a+b, c) = 2 + f(a,c) + f(b,c)
2*(a+b)*c - 2 = 2 + 2*a*c-2 + 2*c*b-2
OK!
结果为
f1(a,b) = 2*a*b-2