130721UVA组队练习赛

13 篇文章 0 订阅
3 篇文章 0 订阅

B. Bits Equalizer

昨天一开始是两个人看题,听别的组说B题是编辑距离裸题,就看了一下,发现不是编辑距离,但也是道水题,就直接敲了。但是连WA5发。。。最后debug才发现是记录‘0’和‘1’的标记变量在下面写反了,一直各种WA,,,而且之前也发现了各种小错误(ps:之前样例居然一直过,不得不说样例太猥琐了)。就直接上代码了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int a1,b1,a2,b2,a3,b3;
int c,i,j,cas,n,h,m,l;
char x[101],y[101];
void work(char *p,char *q)
{
    n=strlen(p);
    a1=a2=b1=b2=0;
    for(i=0; i<n; ++i)
    {
        if(p[i]=='0')
        {
            a1++;
        }
        if(p[i]=='1')
        {
            b1++;
        }
        if(q[i]=='0')
        {
            a2++;
        }
        if(q[i]=='1')
        {
            b2++;
        }
    }
    if(b1>b2)
    {
        printf("Case %d: -1\n",cas);
    }
    else
    {
        l=a2-a1;
        h=b2-b1;
        m=l+h;
        for(i=0; i<n; ++i)
        {
            if(p[i]=='?')
            {
                if(q[i]=='1'&&h>0)
                {
                    p[i]='1';
                    h--;
                }
                else if(q[i]=='0'&&l>0)
                {
                    p[i]='0';
                    l--;
                }
            }
        }
        if(l>0)
        {
            for(i=0; i<n; ++i)
            {
                if(p[i]=='?')
                {
                    p[i]='0';
                }
            }
        }
        if(h>0)
        {
            for(i=0; i<n; ++i)
            {
                if(p[i]=='?')
                {
                    p[i]='1';
                }
            }
        }
        a3=b3=0;
        for(i=0; i<n; i++)
        {
            if(p[i]!=q[i])
            {
                if(p[i]=='0')
                {
                    b3++;
                }
                else
                {
                    a3++;
                }
            }
        }
        printf("Case %d: %d\n",cas,b3+m);
    }
}
int main()
{
    scanf("%d",&c);
    cas=0;
    while(c--)
    {
        cas++;
        scanf("%s%s",&x,&y);
        work(x,y);
    }
    return 0;
}

C. LCM Pair Sum

这题一开始是队友敲的,但是后来交了一次发现RE,才发现复杂度绝对爆了,后来我也看这题,对第一个样例进行一下简单的分配解析(1,2,2,3,3,6,6,6,6)而且给出的因数都是质数,所以最小公倍数必然是(p1^a1)*(p2^a2)*(p3^a3)*...*(pn^an),再结合多项式相乘的项数系数就可以初步得到如下的等式:

sum=(1+p1+p1^2+...+(a1+1)*p1^a1)*(1+p2+p2^2+...+(a2+1)*p2^a2)*...(1+pn+pn^2+...+(an+1)*(pn^an));

CE了一次,发现bnu上面貌似用不了__int64,,最后改long long了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define N 1000000007
using namespace std;
int main()
{
    int t,n,a[22],b,k[22],ge,cas=0,i;
    long long sum,num,x,y;
    scanf("%d",&t);
    while(t--)
    {
        cas++;
        scanf("%d",&n);
        sum=1;
        num=1;
        for(i=0;i<n;++i)
        {
            scanf("%d%d",&a[i],&k[i]);
            x=1;
            y=0;
            ge=k[i];
            k[i]++;
            while(ge--)
            {
                y=(y+x)%N;
                x=(x*a[i])%N;
            }
            y=(y+x*k[i])%N;
            sum=(sum*y)%N;
            num=(num*x)%N;
        }
        printf("Case %d: %lld\n",cas,(sum+num)%N);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值