【做题记录】CF194B Square

Problem

CF194B Square

Solution

这是一道比较有趣的数学题。
我们设结果为 (x+1),为什么 (+1) 呢?为的是后面好计算。这里加的 (1) 是最开始放的那个。
容易看出题意就是从 (0) 开始,每次加 (n+1) 再对 (4n) 取模,直到变成 (0) 为止。问这样的操作要几次。于是可以列出下面这个方程:

[x(n+1) equiv 0 pmod{4n} ]

[xn+x equiv 0 pmod{4n} ]

到这里好像没有头绪了……
可以想到结果应该是和 (4) 有关的,于是我们可以分类讨论下。

(由于题目要求,算出来的都是最小正整数解,所以下面直接用 (=) 了QAQ)

(n equiv 0 pmod 4) 时,显然

[xn equiv 0 pmod{4n} ]

所以 (x equiv 0 pmod{4n}),容易得到

[x=4n ]

(n equiv 1 pmod 4) 时,可以像上面那样算出 (x+x equiv 0 pmod{4n}),所以又可以得到

[2x=4n ]

[x=2n ]

(n equiv 2 pmod 4) 时,又可以得到 (2x+x equiv 0 pmod{4n}),此时可以得到

[x=frac{4}{3}kn ]

显然题目要让 (k) 尽量小且结果为正整数,所以 (k=3),于是就能得到

[x=4n ]

(n equiv 3 pmod 4) 时,可以得到

[3x+x equiv 0 pmod{4n} ]

[x equiv 0 pmod n ]

[x=n ]

整理一下就是:

  • (n mod 4=0)时,(ans=4n+1)
  • (n mod 4=1)时,(ans=2n+1)
  • (n mod 4=2)时,(ans=4n+1)
  • (n mod 4=3)时,(ans=n+1)

(ans) 表示题目要求的答案。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long T,n;
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		switch(n%4)
		{
			case 0:printf("%lld
",4*n+1);break;
			case 1:printf("%lld
",2*n+1);break;
			case 2:printf("%lld
",4*n+1);break;
			case 3:printf("%lld
",n+1);break;
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/mk-oi/p/14032947.html