下午做的时候,一直TLE,后来一个学长卡着时间过了,看了下,发现
for(int i=1;i<=m;i++)
{
int w=input();
for(int j=1;j<=n;j++)
{
int s=(j+w)%n;
double p1=ans[j][1];
double p0=ans[j][0];
if(s==0) s=n;
int t=(j-w+n)%n;
if(t==0) t=n;
ans[j][i%2]=(ans[s][(i%2)^1]+ans[t][(i%2)^1])/2;
}
}
我以前是从j来计算s和t;
他是从s,t来计算j,
这多了一次运算。我就TLE了==
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
inline int input()
{
int r=0;
char c;
c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') r=r*10+c-'0',c=getchar();
return r;
}
double ans[210][2];
int n,m,l,r;
int main()
{
while(1)
{
n=input(),m=input(),l=input(),r=input();
if(n==0&&m==0&&l==0&&r==0) break;
if(m==0)
{
if(l<=1&&r>=1) printf("1.0000\n");
else printf("0.0000\n");
continue;
}
memset(ans,0,sizeof(ans));
ans[1][0]=1;
for(int i=1;i<=m;i++)
{
int w=input();
for(int j=1;j<=n;j++)
{
int s=(j+w)%n;
double p1=ans[j][1];
double p0=ans[j][0];
if(s==0) s=n;
int t=(j-w+n)%n;
if(t==0) t=n;
ans[j][i%2]=(ans[s][(i%2)^1]+ans[t][(i%2)^1])/2;
}
}
double A=0;
for(int i=l;i<=r;i++)
{
A+=ans[i][m%2];
}
printf("%.4lf\n",A);
}
return 0;
}