bzoj 2468: [中山市选2010]三核苷酸

2468: [中山市选2010]三核苷酸

Description

三核苷酸是组成DNA序列的基本片段。具体来说,核苷酸一共有4种,分别用’A’,’G’,’C’,’T’来表示。而三核苷酸就是由3个核苷酸排列而成的DNA片段。三核苷酸一共有64种,分别是’AAA’,’AAG’,…,’GGG’。给定一个长度为L的DNA序列,一共可以分辨出(L-2)个三核苷酸。现在我们想用一些统计学的方法来进行一些分析,步骤如下:

1.       对于这(L-2)个三核苷酸,我们从左到右给予编号,分别为1到L-2。

2.       从这(L-2)个三核苷酸挑选一对出来,一共有(L-2)*(L-3)/2种可能。如果某一对三核苷酸是一样的,我们就记录他们之间的距离。他们之间的距离定义为他们的编号之差。

3.       根据我们所记录的“样本数据”,我们现在需要计算样本数据的方差。方差的计算公式是S2=[(x1-X) 2+(x2-X) 2+…+(xn-X)2]/n, X=(x1+x2+…+xn)/n。如果样本的大小n=0,那么我们认为S2=X=0。

例如,我们要统计DNA序列’ATATATA’:

1.       为三核苷酸编号. L1: ATA, L2:TAT, L3:ATA, L4:TAT, L5:ATA.

2.       (L1,L3)=2, (L1,L5)=4, (L3,L5)=2, (L2,L4)=2. 所以样本数据是2,4,2,2.

3.       样本数据平均值X=(2+4+2+2)/4=2.5.

方差S2=[(2-2.5)2+(4-2.5) 2+(2-2.5)2+(2-2.5)2]/4=0.75.

给定一个DNA序列,请你计算出它的方差。

Input

输入包含多组测试数据。第一行包含一个正整数T,表示测试数据数目。每组数据包含一个由’A’,’G’,’C’,’T’组成的字符串,代表要统计的DNA序列。DNA序列的长度大于等于3且不会超过100000。

Output

对每组测试数据,输出一行答案,为一个保留6位精度的实数,代表S2的值。如果你的答案和标准答案的“相对误差”小于1e-8,你的答案会被视为正确的答案。

Sample Input

1
ATATATA

Sample Output

0.750000

题解:

没什么好说的。。

无非是自己推一下公式,不过要注意最后再平方时可能会爆long long,直接有double类型先除就好了。。

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int N=100005;
#define ll long long
char c[N];
int T,n,i,a[N],b[N];
ll s[505],sum[505],cnt[505],s1[505],s2[505],S,ans,Ans;
double fans;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",c+1);
        n=strlen(c+1);
        for(i=111;i<=444;i++)
            s[i]=sum[i]=s1[i]=s2[i]=cnt[i]=0;
        for(i=1;i<=n;i++)
        {
            if(c[i]==‘A‘) a[i]=1;else
            if(c[i]==‘G‘) a[i]=2;else
            if(c[i]==‘C‘) a[i]=3;else
            a[i]=4;
        }
        for(i=1;i<=n-2;i++)
            b[i]=a[i]*100+a[i+1]*10+a[i+2];
        for(i=1;i<=n-2;i++)
        {
            s[b[i]]+=cnt[b[i]]*i*i+s1[b[i]]-s2[b[i]]*i*2;
            sum[b[i]]+=cnt[b[i]]*i-s2[b[i]];
            s1[b[i]]+=(ll)i*i;
            s2[b[i]]+=i;
            cnt[b[i]]++;
        }
        ans=Ans=S=0;
        for(i=111;i<=444;i++)
            ans+=s[i],Ans+=sum[i],S+=cnt[i]*(cnt[i]-1)/2;
        if(S==0) fans=0;else fans=1.0*ans/S-(1.0*Ans/S)*(1.0*Ans/S);
        printf("%.6f\n",fans);
    }
    return 0;
}

  

时间: 2024-12-14 14:08:04

bzoj 2468: [中山市选2010]三核苷酸的相关文章

BZOJ 2467: [中山市选2010]生成树 [组合计数]

2467: [中山市选2010]生成树 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 638  Solved: 453[Submit][Status][Discuss] Description 有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.如图0所示是一个4-五角形圈. 现在给定一个n五角形

BZOJ2468 : [中山市选2010]三核苷酸

令d[i]为第i个样本数据,cnt为样本个数,经过化简可得 \[ans=\frac{\sum(d[i]^2)}{cnt}-(\frac{\sum d[i]}{cnt})^2\] 枚举每一种可能的三核苷酸,得到它出现的各个位置,假设当前出现了tot个,第i个的编号为a[i],经过化简可得 \[cnt+=C_{tot}^2\] \[\sum d[i]+=\sum (a[i+1]-a[i])i(tot-i)\] \[\sum d[i]^2+=tot\sum(a[i]^2)-(\sum a[i])^2\

BZOJ 2467 中山市选2010 生成树 组合数学

题目大意:给定一个图,图的中心是一个n个点的多边形,每条边都外接一个五边形,求生成树个数 Matrix Tree定理?不会! 观察这个图 5n条边 4n个点 每个五边形都是一个环 必须拆掉一条边 拆掉之后发现4n个点 4n条边 是一个基环树 基环树的环上的边由中心多边形被拆掉的边所在的五边形的剩余边与中心多边形未被拆掉的边构成 容易发现这个环上任意拆掉一条边都会导致某个五边形被拆掉两条边 且一条边在中心多边形上 于是可知 这个图成为一棵树当且仅当一个五边形被拆掉两条边 剩余五边形被拆掉一条边 且

[bzoj2467][中山市选2010]生成树_快速幂

生成树 bzoj-2467 中山市选2010 题目大意:题目链接 注释:略. 想法:首先,考虑生成树的性质.每两个点之间有且只有一条路径.我们将每个五边形的5条边分为外面的4条边和内部的一条边,在此简称为外边和内边.那么显然,每个五边形的4条外边至少需要选3条. 如果选了3条外边而且内边也没选,那么这个五边形就会被拆成两个部分.如果有2个五边形这么做,就会有两个部分之间直接断开,不符合生成树的定义.而且想让一个五边形和另一个五边形断开或者这个五边形从自身断开,只有这一种方案.如果没有任何一个五边

bzoj 2441 [中山市选2011]小W的问题

bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5),如果满足: ·x1 < x2 < x3 < x4 < x5 ·y1 > y3 > y2 ·y5 > y3 > y4 则称它们构成一个&quo

BZOJ 2466: [中山市选2009]树( 高斯消元 )

高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int ma

BZOJ 2440: [中山市选2011]完全平方数(二分答案 + 莫比乌斯函数 + 容斥原理)

传送门 2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2693  Solved: 1307[Submit][Status][Discuss] Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些 数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而 这丝毫不影响他对其他数的热爱. 这天是小X的生日,小 W 想送一个数给他作为生日礼物.当然他不能送

【bzoj 2467】[中山市选2010]生成树(数论--排列组合)

题目:有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的顶点.现在给定一个n五角形圈,你的任务就是求出n五角形圈的不同生成树的数目.还记得什么是图的生成树吗?一个图的生成树是保留原图的所有顶点以及顶点的数目减去一这么多条边,从而生成的一棵树.注意:在给定的n五角形圈中所有顶点均视为不同的顶点. 解法:题目是问使这 N 五角形圈生成树的种数.而生成树

BZOJ2467 [中山市选2010]生成树

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! 题目链接:BZOJ2467 正解:矩阵树定理 or  组合数学 解题报告: 这道题有两种做法- 一种是建图,然后用$Matrix-Tree$定理强上,建出基尔霍夫矩阵,高斯消元,但是建图的话有点麻烦. 还有一种就是纯粹从组合数学的角度了: 考虑如果$n$个