Codeforces #191(Div.2)解题报告

http://codeforces.com/contest/327

  第一次正儿八经写cpp程序啊,没想到写着写着还得查书,看看哪个地方有没有分号啥的,写三目表达式把问号和冒号写反了也查了很长时间。唉,本来以为随便看看书就能转来着。结果第一次写就在比赛写,结果就是我只出了A题,耻辱啊。还有就是半年不碰OI,感觉实现能力还可以,但是调试就完全不行了啊。还有就是一些思路都跟不上了。

A. Flipping Game

  一开始看错题了,以为是要求连续,乱搞扫描弄弄,后来发现理解错题了,干脆写了个O(N^3)暴力。也可以转化为最大连续子序列和DP之。

B. Hungry Sequence

  我输出了质数表,没想到有更简单的做法。就是输出一些比较大的递增的数,考虑选择一些适当的第一个数a,使得2*a都比a+n大。也有其他类似的方法。

  留个线性筛模版吧。

Code#include <iostream>
#include <cstring>
#define ull (unsigned long long) 
using namespace std;
int main()
{
    long int n,maxn=100,prime[100],num=0;
    bool v[maxn];cin>>n;
    memset(v,0,(maxn+1)*sizeof(v[0]));
    for(int i=2;i<=maxn;i++){
        if(num>=n)break;
        if(!v[i])prime[num++]=i;
          for(int j=0;(j<num)&&(ull i*prime[j]<=maxn);j++){
              v[i*prime[j]]=1;if(!(i%prime[j])) break;
          }
    }
    for(int i=0;i<n;i++)
        cout<<prime[i]<<' ';
    cout<<endl;
}

 

C.Magic five

  搞成等比数列求和再用个费马小定理。留个快速幂模版。

  这题的关键在于我写坑了很多地方,各种调试。

  1.输入写坑了

  2.快速幂有个地方把乘写成加

  3.a1,q爆long long,因为忘记取模

   4.a1加取模以后,三目表达式哪里少些一对括号变成q:0+a1调了好久

  还是要仔细一点啊。

Code#include <iostream>
#include <cstdio>
#define ll long long
const long int MO=1000000007;
using namespace std;
ll pow(ll a,ll b)
    {
	ll res=1;
    while(b){
      res=(((b & 1)?a:1)*res)%MO;
      b>>=1;a=(a*a)%MO;
    }
    return res;
    }
int main()
{   
    ll a1=0,q=1,m=0,t,n;
    for(m=0;(t=getchar())!='\n';q=(q<<1)%MO,m++)
        a1=(((((char)t=='0')or((char)t=='5'))?q:0)+a1)%MO;
    cin>>n;  
    ll ans=(((a1*(pow(q,n)-1))%MO)*pow(q-1,MO-2))%MO;
    cout<<ans<<endl;
    return 0;
}

 

D.Block Tower

  floodfill边建边拆,注意读题。我觉得BFS出来,把队列里头东西搞搞输出来也对,而且比DFS好写,但是没写。代码不贴了。

E.Axis Walking

  按说这个复杂度应该能过啊。但是第七个点超时了。不想写了。

Code#include <iostream>
#include <cstring>
#include <cstdio>
#define  lowbit(x) ((x)&(-(x)))
#define  ll long int
using namespace std;
const ll MO=1000000007;
const int MAXN=24;
int calc(int x)
    {int i;for(i=0;x>0;i++)x>>=1;return i-1;}
int main()
{
    ll  sum[1<<MAXN]={0},f[1<<MAXN]={0};
    int n,a[24],k,d[2];
    cin>>n;for(int i=0;i<n;i++)cin>>a[i];
    cin>>k;for(int i=0;i<k;i++)cin>>d[i];
    for(int i=0;i<n;i++)f[1<<i]=1;
    for(int i=1;i<(1<<n);i++){
        sum[i]=sum[i^lowbit(i)]+a[calc(lowbit(i))];
        for(int j=0;j<k;j++)if(sum[i]==d[j])f[i]=-1;
        if(f[i]<0){f[i]=0;continue;}
        for(int j=0;j<n;j++)
            f[i]=(f[i]+((i&(1<<j))?f[i^(1<<j)]:0))%MO;
    }
    cout<<f[(1<<n)-1]<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/lijianlin1995/p/3180808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值