zoukankan      html  css  js  c++  java
  • Vjudge contest 425291

    Problem A

    你可以构造出一种操作数为 (log_2n) 级别的方法,但是有很多细节,特判一下就好了。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=3e5+5;
    int n,a[N];
    int cnt=1,flag,res=0;
    signed main(){
    	cin>>n;if(n==1) return printf("0
    "),0;
    	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    	n=unique(a+1,a+1+n)-a-1,flag=a[2]-a[1];
    	for(int i=2;i<n;++i) cnt+=((a[i]-a[i-1])*(a[i]-a[i+1])>0);
    	// printf("%d
    ",cnt);
    	for(;cnt>1;cnt>>=1,res++) if(cnt&1) cnt++,flag=0;
    	return printf("%lld
    ",res+(flag<0)),0;
    }
    

    Problem B

    你发现两种操作完全等价于删掉两数中的 (max)(min) ,然后你就可以变成删除一个数,最后留下的数时 (1) 即可,然后随便计数一下就可以了。

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=1e6+5;
    const int MOD=998244353;
    int n,a[N],res=0;
    int fac[N],ifac[N],ksm[N<<1];
    int qpow(int x,int k){
    	int res=1;
    	for(;k;k>>=1,x=x*x%MOD)
    	if(k&1) res=res*x%MOD;
    	return res;
    }
    int cal(int n,int m){
    	return fac[n+m]*ifac[n]%MOD*ifac[m]%MOD;
    }
    int f(int n,int m){
    	return cal(n,m)*ksm[n<<1]%MOD*ksm[m<<1]%MOD;
    }
    signed main(){
    	cin>>n,fac[0]=ifac[0]=ksm[0]=1;
    	for(int i=1;i<=n;++i) fac[i]=fac[i-1]*i%MOD;
    	for(int i=1;i<=n;++i) ifac[i]=qpow(fac[i],MOD-2);
    	for(int i=2;i<=(n<<1);i+=2) ksm[i]=ksm[i-2]*(i-1)%MOD;
    	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    	for(int i=1;i<=n;++i) if(a[i]) res+=f(i-1,n-i),res%=MOD;
    	return printf("%lld
    ",res),0;
    }
    

    Problem C

    这道题目发现 (a_ile 100) ,这意味着我们可以枚举 (A) 的子集(当然不是直接枚举了),感觉要从这里入手。

    我们考虑问的信息。我们需要知道的是在 (a) 全部选完的情况下并且以 (a) 结尾的概率是多少。发现枚举 (A) 的子集好像没有什么用?

    我们能否可以尝试求出选取出每一个 (A) 的子集同时结尾为 (a) 的概率,这样的话我们就可以通过随便选 (A) 且以 (a) 结尾的概率来相减得到了。

    我们先考虑后者如何计算,就是钦定一个 (a) 作为结尾,然后剩下随机选取前面的概率乘上再选择这个位置的概率。


    我们发现,对于一个 (b_i) ,我们可以比较轻易的求出他对于一个集合时,先选于这个集合的概率:

    [P(b_i,S)=frac{b_i}{b_i+sum_{iin S}a_i} ]

    然后,我们需要求出的是对于每一个 (b_i) ,他后选于全集 (A) 的概率 (p_i) ,那么最后的答案就是 (n+m-sum_{i=1}^m p_i)

    我们考虑怎么求。因为我们可以求出对于每一个集合的概率,我们就可以用总概率减去每一个子集的概率乘上容斥系数就可以求出后选的概率了。

    然后就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    const int N=105;
    const int MOD=998244353;
    int n,m,a[N],b[N];
    int f[N*N],res=0;
    int ksm(int x,int k){
    	int res=1;
    	for(;k;k>>=1,x=x*x%MOD)
    	if(k&1) res=res*x%MOD;
    	return res;
    }
    signed main(){
    	cin>>n>>m,res=n+m;
    	for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
    	for(int i=1;i<=m;++i) scanf("%lld",&b[i]);
    	f[0]=1;
    	for(int i=1;i<=n;++i){
    		for(int j=N*N-1;j>=a[i];--j)
    		f[j]+=MOD-f[j-a[i]],f[j]%=MOD;
    	}
    	for(int i=1;i<=m;++i){
    		for(int j=0;j<N*N;++j)
    		res+=MOD-f[j]*b[i]%MOD*ksm(b[i]+j,MOD-2)%MOD,res%=MOD;
    	}
    	return printf("%lld
    ",res),0;
    }
    
  • 相关阅读:
    P/Invoke .NET调用win32API
    怎么将字节流转换成汉字?(硬件printf的汉字怎么解析?)
    个人电脑配置FTP服务器,四张图搞定。项目需要,并自己写了个客户端实现下载和上传的功能!
    C# 中Datetime类用法总结
    C#环境datagidview添加删除操作
    C#环境下,文本框翻屏,怎么一直显示当前插入的内容!!!!!!!!!!!!!!!!
    eclipse下提交job时报错mapred.JobClient: No job jar file set. User classes may not be found.
    SQL Server连接数据库失败,可能的问题!
    写好的mapreduce程序,编译,打包,得到最后的jar包! 验证jar包 ! 整体流程
    在虚拟机环境下,电脑间拷贝配置好的伪分布式Hadoop环境,出现namenode不能启动的问题!
  • 原文地址:https://www.cnblogs.com/Point-King/p/14526251.html
Copyright © 2011-2022 走看看