rt,我看题解写的有点抽象(看不懂orz),而且这题是个黄,想请问一下正确做法,以及有无佬能帮忙看下我场上的做法为什么假了/写挂了。
#include<bits/stdc++.h>
#define int __int128
#define R read()
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-')
{
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+c-48;
c=getchar();
}
return x*f;
}
void write(int x)
{
static int st[35],top=0;
if(x<0)
{
x=-x;
putchar('-');
}
do
{
st[top++]=x%10;
x/=10;
}while(x);
while(top)
{
putchar(st[--top]+48);
}
putchar('\n');
}
int T,n,m;
signed main()
{
// freopen("data.in","r",stdin);
// freopen("E.txt","w",stdout);
T=R;
while(T--)
{
n=R,m=R;
if(n&1)
{
if(m>=((n+1)>>1))
{
write(n+(n-1)*(n-1)/2);
continue;
}
if((n+1)%4)
{
int cnt=(n+1>>1)*(n+1>>1),he,lst,fl=m&1;
if(m==1)
{
write(cnt);
}
else
{
m>>=1;
he=n-3;
lst=n+1-4*m;
cnt+=(he+lst)*m;
if(!fl)
{
cnt-=lst;
}
write(cnt);
}
}
else
{
m++;
int cnt=(n-1>>1)*(n-1>>1),he,lst,fl=m&1;
if(m==1)
{
write(cnt);
}
else
{
m>>=1;
he=n-1;
lst=n+3-4*m;
cnt+=(he+lst)*m;
if(!fl)
{
cnt-=lst;
}
write(cnt);
}
}
}
else
{
if(m>=n/2)
{
write((n+2)*n>>1);
continue;
}
if(n%4)
{
int cnt=(n+2>>1)*(n+2>>1),fl=m&1,he,lst;
if(m==1)
{
write(cnt);
}
else
{
m>>=1;
he=n-2;
lst=n-4*m+2;
cnt+=(he+lst)*m;
if(!fl)
{
cnt-=lst;
}
write(cnt);
}
}
else
{
m++;
int cnt=(n>>1)*(n>>1),fl=m&1,he,lst;
if(m==1)
{
write(cnt);
}
else
{
m>>=1;
he=n;
lst=n-4*(m-1);
cnt+=(he+lst)*m;
if(!fl)
{
cnt-=lst;
}
write(cnt);
}
}
}
}
return 0;
}