题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6600
题意:给你一个数n,让你从区间[0,]找出一个数x,通过一些询问;
每次询问都事询问一个y 属于[0,],询问结束之后 你将得到 x&y 与y相不相等;
问 在保证你能精确的确定x的值的情况下,保证最少需要的询问数的情况下,有多少种询问的方式,(你询问的y的顺序可以不同)
比如给你一个n=3 区间里的数有 0 1 2 3 4 5 6 7 这些数的二进制表示最多只有三位 所以对于每一个数x,选择y的时候每次只选择只有一个位置是1的数,
比如 x=4, (二进制表示100)选择y的时候
1、先选择1,二进制表示为001 , 100&001 !=001 所以x的第三位不是1
2、选择2 二进制表示为010 , 100&010 !=010 所以x的第二位不是1
3、选择4 二进制表示为100 , 100&100 ==100 所以x的第三位是1
所以x = = 4
选择y的时候 由于只是为了确定哪一位是1或不是1所以 和顺序无关,所以先选择1,先选择2还是先选择4都无所谓,所以结果就是 即 n!
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int maxn = 1e6+3;
const ll mod=1e6+3;
ll ans[maxn*2],n;
int main()
{
ans[1]=1;
for(int i=2;i<1000003;i++) {
ans[i]=ans[i-1]*i % mod;
}
while(scanf("%d",&n) !=EOF) {
if(n>=maxn) puts("0");
else printf("%lld\n",ans[n]);
}
return 0;
}