|
这个改造自C程序的位操作
#include <stdio.h>
#include <stdlib.h>
int n = 12;
int q(int i, int j, int k, int l)
{
int ans = 0;
for(int a = ((1 << n) - 1) & ~(i | j | k), p = a & -a; a!=0; a ^= p, p = a & -a)
ans += q(i + p, (j + p) * 2, (k + p) / 2, l + 1);
return l == n ? 1 : ans;
}
int main(int argc,char*argv[])
{
if (argc==2)n=atoi(argv[1]);
printf("%d\n", q(0, 0, 0, 0));
}
---------------
create or replace function bitor(x IN NUMBER,y IN NUMBER)
return number is
begin
return (x + y) - BITAND(x, y);
end;
/
create or replace function bitxor(x IN NUMBER,y IN NUMBER)
return number is
begin
return (x + y) - BITAND(x, y)*2;
end;
/
create or replace function bitnot(x IN NUMBER) --~x=x^0xffff
return number is
begin
return (x -1 ) - BITAND(x, -1)*2;
end;
/
create or replace function bitlmv(x IN NUMBER,y IN NUMBER)
return number is
begin
return x* power(2,y);
end;
/
create or replace function q(n int, i int, j int, k int, l int)
return int
as
ans int:= 0;
a int;
p int;
begin
a := bitand((bitlmv(1, n) - 1) , bitnot(bitor(bitor(i , j ), k)));
p := bitand(a , -a);
while(a<>0)loop
ans :=ans+ q(n,(i + p), (j + p) * 2, trunc((k + p) / 2), l + 1);
a := bitxor(a,p);
p := bitand(a , -a);
end loop;
return case l when n then 1 else ans end;
end;
/
SQL> select q(8,0, 0, 0, 0)from dual;
Q(8,0,0,0,0)
------------
92
已用时间: 00: 00: 00.06
SQL> select level,q(level,0, 0, 0, 0)nq from dual connect by level<=12;
LEVEL NQ
---------- ----------
1 1
2 0
3 0
4 2
5 10
6 4
7 40
8 92
9 352
10 724
11 2680
12 14200
已选择12行。
已用时间: 00: 00: 07.12
|
|