您的位置:首页 > 其它

Codeforces Round #191 (Div. 2)

2013-07-06 19:13 411 查看
知道有比赛,可是忘记报名了,坑啊

好吧,就三题会做

327A Flipping Games

给定一由0、1组成的串,改变某个区间所有元素的状态(0→1、1→0),要求使改变后的元素含1最多,并输出1的个数:

考预处理的吧,用两个数组分别记录到从 0 到 i 这个位置,一共有多少个0或者1,那么区间 i ~ j 之间1的个数就是 is1[ j ] - is1[ i - 1]。

#include<iostream>
#include<stdio.h>
#include<string.h> 
#include<algorithm>
using namespace std;
int main()
{
    int is0[101],is1[101],n,ans,a[101],max,i,j,k;
    while (scanf("%d",&n)!=EOF)
    {
          is0[0]=0;is1[0]=0;
          for (i=1;i<=n;i++)
          {
              scanf("%d",&a[i]);
              if (a[i]==0) is0[i]=is0[i-1]+1,is1[i]=is1[i-1];
              else is1[i]=is1[i-1]+1,is0[i]=is0[i-1];
          }
          ans=0;
          for (i=1;i<=n;i++)
          {
              max=0;
              for (j=i;j<=n;j++)
              {
                  int num0;
                  num0=is0[j]-is0[i-1];
                  if (is1[i-1]+num0+is1
-is1[j]>max) max=is1[i-1]+num0+is1
-is1[j];
              }
              if (ans<max) ans=max;
          }
          printf("%d\n",ans);
    }
    return 0;
}


327B hungry sequence

小学数学题,只要读题仔细点就OK。

题意是求一个递增数列,使得数列中任意两个元素都不能被对方整除,而数列长度10^5 ,数据的取值确实10^7,那么只要在10^5后面任意位置取要求长度的连续整数就OK了。

#include<iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int n,i;
    while (scanf("%d",&n)!=EOF)
    {
          for (i=1;i<n;i++)
              printf("%d ",1000000+i);
          printf("%d\n",1000000+i);
    }
    return 0;
}


327C magic five

给定一个长度不超过10^5的数,删掉若干个之后使其能被5整除,求有多少种方法,可以有第一个数字是0的情况,但是不能全部删掉!

等比数列求和吧,因为数据很大,结果要mod 10^9+7,所以不能直接用等比数列求和公式,因为不能边除边MOD。

设项数为a[ i ]前N项的和为S(N),我们可以发现:

a[ 1 ]*q^(n/2)=a[ n/2+1 ]

a[ 2 ]*q^(n/2)=a[ n/2+2 ]

......

a[ n/2 ]*q(n/2)=a[ n ]

即T(n/2)*q^(n/2)=T(n/2~n)。

所以T(n)=T(n/2)+T(n/2)*q^(n/2),当然要讨论奇偶,如果是奇数则还要加上a(n)。

#include<iostream>
#include<stdio.h>
#include<string.h>
#define ll __int64
#define oo 1000000007
using namespace std;
int a[100010];
ll pow(ll k)
{
    if (k==0) return 1;
    if (k==1) return 2;
    ll tmp;
    tmp=pow(k/2);
    if (k%2) return (tmp*tmp%oo)*2%oo;
    //cout<<tmp*tmp%oo<<' ';
    return tmp*tmp%oo;
}
ll solved(ll ans,ll k,ll m)
{
    ll tmp,temp;
    if (k==1) return ans;
    tmp=solved(ans,k/2,m)%oo;
    temp=tmp*pow(m*(k/2))%oo;
    if (k%2) return ((tmp+temp)%oo+ans*pow(m*(k-1))%oo)%oo;
    return (tmp+temp)%oo;
}
int main()
{
    ll k,len,i,j,ans;
    a[0]=1;
    for (i=1;i<100001;i++)
        a[i]=a[i-1]*2%oo;
    char str[100010];
    while (scanf("%s",str)!=EOF)
    {
        scanf("%I64d",&k);
        len=strlen(str);
        ans=0;
        for (i=0;i<len;i++)
        {
            if (str[i]=='0'||str[i]=='5')
                ans=(ans+a[i])%oo;
        }
        //cout<<ans<<endl;
        printf("%I64d\n",solved(ans,k,len)%oo);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: