soj 131 找题

本文针对SOJ131问题提供了解决方案,通过分析字符串中1的位置,利用状态转移方程计算特定操作后两字符串相同的概率,并给出了具体的C++实现代码。
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.youkuaiyun.com/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\n", ans);
    return 0;
}

转载于:https://www.cnblogs.com/MyNameIsPc/p/9165879.html

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值