SDNU-多校训练赛2-[ABF]

问题虫洞——A:A - Just Skip The Problem HDU - 6600


黑洞内窥:

给出一个数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

ACcode:


#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;
}



问题虫洞——B:B - Everything Is Generated In Equal Probability HDU - 6595


思维光年:

虽然知道肯定会有公式,但是还是没有做出来。。。。。

那么这个神奇的公式就是:ans = (n*n - 1)/ 9

推荐两篇博客吧,证明都给的很详细,我自己再琢磨琢磨吧。。。

推荐博客一:Everything Is Generated In Equal Probability

推荐博客二:HDU 6595 Everything Is Generated In Equal Probability(递推求期望|找规律)


ACcode:


//#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;
}




问题虫洞——F:F - Fansblog HDU - 6608


黑洞内窥:

多组样例t,

每组样例给你一个质数 p (1e9 <= p <=1e14),然后你将得到p的前一个质数Q,求(Q!% p)


思维光年:

咱也不知道,咱也不敢问,,,用到了我不知道的威尔逊定理,,,,

详细请见该篇博客:F - Fansblog HDU - 6608(威尔逊定理推导)

这里就简单的给出代码了:

ACcode

//#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;
}

你可能感兴趣的:(一九暑测)