给出一个数n, 而你也将得到一个连你自己也不到的数X,
然后你可以用这个数X去和一个Y进行与运算,而系统也会回答你与运算的结果是不是等于Y,
(其中 0<= X, Y <= 2^n-1)
问,你一共有多少种方法可以在和Y与运算后知道你手上的数X。。
首先,我们可以用X去 和1&, 即X&1,依次判断X的二进制的每一位是0还是1,
结果显然是与不同的Y进行了n次与操作(这里的n是二进制位数)
那么到底有多少种方法呢? 因为你用X&的n次操作中是无序的,总的结果数就应该是Ann
即 sum = 排列组合数Ann = n!
还有一点就是,要mod1e6+3,当n>=1e6+3的时候,n!中就会有1e6+3的因子,所以结果就是0
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int p = 1e6 + 3;
ll n;
ll a[p + 10];
int main()
{
a[0] = 1;
for(int i = 1;i <= p; ++i)
a[i] = (a[i - 1] * i) % p;
while(~scanf("%lld",&n))
{
if(n == 0 || n >= p) printf("0\n");
else printf("%lld\n",a[n]);
}
return 0;
}
虽然知道肯定会有公式,但是还是没有做出来。。。。。
那么这个神奇的公式就是:ans = (n*n - 1)/ 9
推荐两篇博客吧,证明都给的很详细,我自己再琢磨琢磨吧。。。
推荐博客一:Everything Is Generated In Equal Probability
推荐博客二:HDU 6595 Everything Is Generated In Equal Probability(递推求期望|找规律)
//#include
//std::ios::sync_with_stdio(false);
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define MAXN 3000005
#define INF 0x3f3f3f3f//将近ll类型最大数的一半,而且乘2不会爆ll
const ll mod = 998244353;
#define mem(a, b) memset(a, b, sizeof(a))
//ll inv(ll b){ return b == 1? 1: (mod-mod/b)*inv(mod%b)%mod;}
ll ksm(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans = ans*a%mod;
a = a*a%mod;
b >>= 1;
}
return ans;
}
int main()
{
ll n;
while(cin >> n)
{
cout << ((n*n-1)*ksm(9, mod-2))%mod << '\n';
}
return 0;
}
多组样例t,
每组样例给你一个质数 p (1e9 <= p <=1e14),然后你将得到p的前一个质数Q,求(Q!% p)
咱也不知道,咱也不敢问,,,用到了我不知道的威尔逊定理,,,,
这里就简单的给出代码了:
//#include
//std::ios::sync_with_stdio(false);
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define MAXN 3000005
#define INF 0x3f3f3f3f//将近ll类型最大数的一半,而且乘2不会爆ll
//const ll mod = 998244353;
#define mem(a, b) memset(a, b, sizeof(a))
ll mod;
ll mul(ll a, ll b)//快速乘
{
ll res = 0;
while(b)
{
if(b&1)
res = (res+a)%mod;
a = (a+a)%mod;
b >>= 1;
}
return res%mod;
}
ll ksm(ll a, ll b)
{
ll ans = 1;
while(b)
{
if(b&1)
ans = mul(ans, a);
a = mul(a, a);
b >>= 1;
}
return ans;
}
bool prime(ll x)
{
for(ll i=2; i*i<=x; ++i)
if(x%i == 0) return 0;
return 1;
}
int main()
{
ll t, n;
cin >> t;
while(t--)
{
scanf("%lld", &n);
mod = n;
ll q = n-1;
while(!prime(q)) q--;
ll ans = n-1;
for(ll i=q+1; i<=n-1; ++i)
ans = mul(ans, ksm(i, mod-2));
cout << ans << '\n';
}
return 0;
}