CF1928C Physical Education Lesson 题解

CF1928C Physical Education Lesson

我们发现,每 2k2 个数构成了一个周期。其中,前 k 个数为前周期,后 k2 个数为后周期。我们对于 x 所处的周期进行分类讨论。

x 在前周期时,它是周期中的第 x 个元素。将总数 n 减去 x,剩下的数一定是由若干个完整的周期组成。枚举它的约数,我们可以用这个约数解出 k 的值。只有 k 为整数且 kn,才能算作一个解,因为前周期最大的数是 k

x 在后周期时,它是周期中的第 2k2x+2 个元素。将总数 n 减去 2k2x+2,剩下的数 (n+x2)(2k2) 一定是由若干个完整的周期组成。我们发现,减去的 2k2 正好是我们要枚举的约数,并不影响 (n+x2)2k2 的整除性。所以我们直接枚举 (n+x2) 的约数,我们可以用这个约数解出 k 的值。只有 k 为整数且 k>n,才能算作一个解,因为后周期最大的数是 k1

注意 x 在后周期时,x1,因为我们发现后周期没有 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;
}
posted @   w9095  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示