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;
}