比赛 20110725 评测结果 C
题目名称 失落的神庙 最终得分 0
用户昵称 .Xmz 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-07-25 09:31:58
显示代码纯文本
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cstdio>

using namespace std;

long long n;

struct node
{
	long long l,r,v;
}q2[20001],q3[20001],q5[20001],q7[20001],q0[20001];
int s0,t0,s2,s3,s5,s7,t2,t3,t5,t7;
void solve()
{
	scanf("%lld",&n);
	q2[1].l=q3[1].l=q5[1].l=q7[1].l=2;
	q2[1].r=3;q3[1].r=5;q5[1].r=9;q7[1].r=13;
	q2[1].v=1;q3[1].v=1;q5[1].v=1;q7[1].v=1;
	s0=s2=s3=s5=s7=t2=t3=t5=t7=1;
	t0=0;
	while (s2<=t2 && s3<=t3 && s5<=t5 && s7<=t7)
	{
		long long R=min(min(q2[s2].r,q3[s3].r),min(q5[s5].r,q7[s7].r));
		long long L=q2[s2].l;
		
		q0[++t0].l=L;q0[t0].r=R;
		q0[t0].v=q2[s2].v+q3[s3].v+q5[s5].v+q7[s7].v;
		
		if (L*2<=n)
		{
			q2[++t2].l=L*2;q2[t2].r=min(R*2+1,n);q2[t2].v=q0[t0].v;
		}
		if (L*3<=n)
		{
			q3[++t3].l=L*3;q3[t3].r=min(R*3+2,n);q3[t3].v=q0[t0].v;
		}
		if (L*5<=n)
		{
			q5[++t5].l=L*5;q5[t5].r=min(R*5+4,n);q5[t5].v=q0[t0].v;
		}
		if (L*7<=n)
		{
			q7[++t7].l=L*7;q7[t7].r=min(R*7+6,n);q7[t7].v=q0[t0].v;
		}
		
		q2[s2].l=R+1;   if(R+1>q2[s2].r) s2++;
		q3[s3].l=R+1;   if(R+1>q3[s3].r) s3++;
		q5[s5].l=R+1;   if(R+1>q5[s5].r) s5++;
		q5[s7].l=R+1;   if(R+1>q7[s7].r) s7++;
	}
	
	printf("%lld\n",q0[t0].v);
	
}

int main()
{
	freopen("losttemple.in","r",stdin);
	freopen("losttemple.out","w",stdout);
	solve();
	return 0;
}