zoukankan      html  css  js  c++  java
  • soj 131 找题

    soj 131 找题

    给出两个长度为n,都含k个1的字符串A,B。现在令(a_1,a_2,dots,a_k)是A中1的下标,(b_1,b_2,dots,b_k)是B中1的下表,然后将a,b等概率随机排列,接下来按1到k的顺序交换(A_{a_i})(A_{b_i})。令P为交换之后A与B相同的概率,求(P*(k!)^2)(998244353)取模的结果。n<=10000。

    本来以为只要随机排列b就行了,但是由于是顺序交换,所以要随机排列必须a和b都排列一下。那怎么办呢?我们来举个栗子:

    图

    上面是a串,下面是b串。我们发现,蓝框内的位置,A数组都能交换两次。红框内的位置只能交换一次。

    设i表示还有i个位置可以交换两次,j表示还有j个位置可以交换一次。(f[i][j])表示剩下i和j的方案数,那么就有状态转移方程:(f[i][j]=f[i-1][j]+f[i][j-1])。(我也想不清楚)。

    https://blog.csdn.net/WerKeyTom_FTD/article/details/78209400

    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int mod=998244353;
    
    const int maxn=10005;
    int l, x, y; 
    char s1[maxn], s2[maxn];
    
    int fmi(int a, int x){
    	long long base=a, ans=1;
    	for (; x; base=base*base%mod, x>>=1) 
    		if (x&1) ans=ans*base%mod;
    	return ans;
    }
    
    int jc[maxn], revjc[maxn];
    void init(){
    	jc[0]=revjc[0]=1;
    	for (int i=1; i<maxn; ++i){
    		jc[i]=1ll*jc[i-1]*i%mod;
    		revjc[i]=fmi(jc[i], mod-2);
    	}
    }
    
    int f[maxn][maxn/2], ans;
    
    inline void up(int &x, int y){ x=(x+y)%mod; }
    int c(int m, int n){ return 1ll*jc[m]*revjc[m-n]%mod*revjc[n]%mod; }
    
    int main(){
    	init(); scanf("%s%s", s1, s2); l=strlen(s1);
    	for (int i=0; i<l; ++i)
    		if (s1[i]==49&&s2[i]==49) ++x;
    		else if (s1[i]==49||s2[i]==49) ++y;
    	y/=2;
    	f[x][y]=1;
    	for (int i=x; i>=0; --i)
    		for (int j=y; j>=0; --j){
    			if (i) up(f[i-1][j], 1LL*i*j%mod*f[i][j]%mod);
    			if (j) up(f[i][j-1], 1LL*j*j%mod*f[i][j]%mod);
    		}
    	for (int i=0; i<=x; ++i)
    		up(ans, 1LL*jc[i]*jc[i]%mod*f[i][0]%mod*c(x+y, i)%mod);
    	printf("%d
    ", ans);
    	return 0;
    }
    
  • 相关阅读:
    TFS对签入文件忽略设置,解决pdb弹出警告
    利用MSSQL对不经常使用的表进行依赖缓存
    IIS 使用多个https和通配证书解决方案
    传递参数安全验证代码示例
    利用GetType反射方法再调用方法进行传递参数实现调用
    ms10_002 IE浏览器漏洞
    ms17-010漏洞复现
    ms08-067漏洞复现
    tomcat使用log4j管理日志
    Popen No such file or directory 错误
  • 原文地址:https://www.cnblogs.com/MyNameIsPc/p/9165879.html
Copyright © 2011-2022 走看看