洛谷的反馈和自测输出不一样?
查看原帖
洛谷的反馈和自测输出不一样?
295864
eigw22h619楼主2022/1/2 00:27

#7 Wrong Answer.wrong answer On line 3 column 18, read 0, expected 2. 记录

输入:

10
738714739
818399345
979944004
564163474
269146882
19087026
136232047
394444009
927109089
2147483647

我的输出: 我的输出

蒟蒻求助,请问这是为何?

源代码:

#include <bits/stdc++.h>
using namespace std;
#define cn const
#define ll long long
cn int N=1700001;
int pr[300000],npr,us[N];
ll phis[N];bitset<N> zhi;
int MX;
void ouls()
{
	zhi[1]=1;us[1]=1;phis[1]=1;
	for(int i=2;i<=MX;i++)
	{
		if(zhi[i]==0){pr[++npr]=i;us[i]=-1;phis[i]=i-1;}
		for(int j=1;j<=npr&&i*pr[j]<=MX;j++)
		{
			zhi[i*pr[j]]=1;
			if(i%pr[j]==0)
			{
				phis[i*pr[j]]=pr[j]*phis[i];
				us[i*pr[j]]=0;break;
			}
			phis[i*pr[j]]=phis[i]*phis[pr[j]];
			us[i*pr[j]]=us[i]*us[pr[j]];
		}
	}
	for(int i=1;i<=MX;i++)us[i]+=us[i-1];
	for(int i=1;i<=MX;i++)phis[i]+=phis[i-1];
}
struct hsh
{
private:
	ll t[10000000],v[10000000];cn int md=9900047;
public:
	int n;hsh(){n=0;}
	inline bool ins(cn ll&ky,cn ll&val)
	{
		int m=ky%md;
		while(t[m]&&t[m]!=ky)++m;
		if(t[m]==ky)return 0;
		++n;t[m]=ky;v[m]=val;return 1;
	}
	inline bool del(cn ll&ky)
	{
		int m=ky%md;
		while(t[m]&&t[m]!=ky)++m;
		if(t[m]!=ky)return 0;
		--n;t[m]=9e18+7;return 1;
	}
	inline bool exi(cn ll&ky)cn
	{
		int m=ky%md;
		while(t[m]&&t[m]!=ky)++m;
		return t[m]==ky;
	}
	inline ll at(cn ll&ky)cn
	{
		int m=ky%md;
		while(t[m]&&t[m]!=ky)++m;
		return t[m]==ky?v[m]:9e18+7;
	}
};
hsh usm,phism;
int usum(cn int&n)
{
	if(n<=MX)return us[n];
	if(usm.exi(n))return usm.at(n);
	int s=1;
	for(ll l=2,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		s-=usum(n/l)*(r-l+1);
	}
	usm.ins(n,s);
	return s;
}
ll phisum(cn int&n)
{
	if(n<=MX)return phis[n];
	if(phism.exi(n))return phism.at(n);
	ll s=(ll)n*((ll)n+1)/2;
	for(ll l=2,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		s-=phisum(n/l)*(r-l+1);
	}
	phism.ins(n,s);
	return s;
}
inline int id23(cn int&n)
{
	cn ll x=(ll)n*n;ll l=-x,r=x;
	while(l!=r-1)
	{
		cn ll m=l+r>>1;
		if(m*m*m<=x)l=m;else r=m;
	}
	return l;
}
inline int re()
{
	int x=0;char ch=getchar();
	while(ch<'0'||ch>'9')ch=getchar();
	while(ch>='0'&&ch<='9'){x=x*10+(ch&15);ch=getchar();}
	return x;
}
inline void wr(ll x)
{
	if(x>=10)wr(x/10);
	putchar(x%10^'0');
}
inline void wr(ll x,char c)
{
    if(x<0){x=-x;putchar('-');}
    wr(x);putchar(c);
}
int main()
{
	int q[11],T=re();
	for(int i=1;i<=T;i++){q[i]=re();MX=max(MX,q[i]);}
	MX=id23(MX);if(MX<0||MX>1700000)MX=1700000;ouls();
	for(int i=1;i<=T;i++){wr(phisum(q[i]),' ');wr(usum(q[i]),'\n');}
	return 0;
}
2022/1/2 00:27
加载中...