• [JZOJ 5810] 简单的玄学


    思路:
    就是考虑一个结论
    对于\(1<=x<=2^n\),那么\(x\)\(2^n - x\)中的2的个数相等。
    证明:
    我们将\(x\)表示成\(2^k*b\),那么\(2^n - x\)就是\(2^n - 2^k*b\)当消去\(k\)个2之后,剩下的就是\(2^n - b\)显然不能被2除了(因为b显然不是一个偶数),
    那么我们推出来的概率式子为:
    \(1 - {\prod_{i=2^n-m+1}^{2^n-1} i\over 2^{n(m-1)}}\)
    问题的瓶颈就是如何求分子的2的个数,应用上面的结论可以将分子化为:
    如何求\((m-1)!\)里的2的个数。
    简单了,随便枚举一下就可以了。
    值得一提的是,这题的数据范围有毒,考虑到当\(m > mod\)时,显然取模为0,所以出题人很好心的没有给\(10^{18}\)的点。
    代码我不知道为什么老是爆炸...

    #include <bits/stdc++.h>
    using namespace std;
    #define ll long long
    const int mod = 1e6+3;
    inline ll pow_mod(ll a,ll b) {
    	ll res = 1;
    	while(b) {
    		if(b & 1) res = res * a % mod;
    		a = a * a % mod;
    		b >>= 1;
    	}
    	return res;
    }
    
    ll n,m;
    ll ans;
    int main () {
    	freopen("random.in","r",stdin);
    	freopen("random.out","w",stdout);
    	scanf("%d %d",&n,&m);
    	if(m > mod) {
    		puts("0 0");
    		return 0;
    	}
    	if(log2(m) > n) {
    		puts("1 1");
    		return 0;
    	}
    	ll t1 = pow_mod(2,n);
    	ll t2 = pow_mod(t1,m-1);
    	for(int i = 1;i < m; ++i) {
    		int tmp = i;
    		while(!(tmp & 1)) {
    			ans ++;
    			tmp >>= 1;
    		}
    	}
    	ll fz = 1;
    	for(int i = 1;i < m; ++i) {
    		fz = fz * (t1 - i);
    	}
    	fz /= pow(2,ans);
    	ll fm = pow_mod(2,n*(m - 1) - ans);
    	printf("%lld %lld\n",(fm - fz)%mod,(fm)%mod);
    	return 0;
    }
    

    马力太弱。。

  • 相关阅读:
    31、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
    30、[源码]-AOP原理-注册AnnotationAwareAspectJAutoProxyCreavi
    29、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreatovi
    magento 常用的函数
    magento性能优化的教程(非常详细)
    magento性能优化
    magento搜索属性值的设置方法
    Magento 的程序架构与流程
    Magento入门开发教程
    高级Magento模型 EAV
  • 原文地址:https://www.cnblogs.com/akoasm/p/9578452.html
Copyright © 2020-2023  润新知