CF1928C Physical Education Lesson 题解
CF1928C Physical Education Lesson
我们发现,每 \(2k-2\) 个数构成了一个周期。其中,前 \(k\) 个数为前周期,后 \(k-2\) 个数为后周期。我们对于 \(x\) 所处的周期进行分类讨论。
当 \(x\) 在前周期时,它是周期中的第 \(x\) 个元素。将总数 \(n\) 减去 \(x\),剩下的数一定是由若干个完整的周期组成。枚举它的约数,我们可以用这个约数解出 \(k\) 的值。只有 \(k\) 为整数且 \(k\ge n\),才能算作一个解,因为前周期最大的数是 \(k\)。
当 \(x\) 在后周期时,它是周期中的第 \(2k-2-x+2\) 个元素。将总数 \(n\) 减去 \(2k-2-x+2\),剩下的数 \((n+x-2)-(2k-2)\) 一定是由若干个完整的周期组成。我们发现,减去的 \(2k-2\) 正好是我们要枚举的约数,并不影响 \((n+x-2)\) 对 \(2k-2\) 的整除性。所以我们直接枚举 \((n+x-2)\) 的约数,我们可以用这个约数解出 \(k\) 的值。只有 \(k\) 为整数且 \(k\gt n\),才能算作一个解,因为后周期最大的数是 \(k-1\)。
注意 \(x\) 在后周期时,\(x\ne1\),因为我们发现后周期没有 \(1\)。
#include <bits/stdc++.h>
using namespace std;
long long t,x,n;
int main()
{
scanf("%lld",&t);
while(t--)
{
long long ans=0,now=0;
scanf("%lld%lld",&x,&n);
now=x-n;
for(long long i=1;i*i<=now;i++)
if(now%i==0)
{
if(i%2==0&&(i+2)/2>=n)ans++;
if((now/i)!=i&&(now/i)%2==0&&((now/i)+2)/2>=n)ans++;
}
now=x+n-2;
if(n!=1)
for(long long i=1;i*i<=now;i++)
if(now%i==0)
{
if(i%2==0&&(i+2)/2>n)ans++;
if((now/i)!=i&&(now/i)%2==0&&((now/i)+2)/2>n)ans++;
}
printf("%lld\n",ans);
}
return 0;
}

浙公网安备 33010602011771号