参考https://m.2cto.com/kf/201612/578388.html
可以看出,被按了奇数次数的灯最后是开着的,而被按了偶数次数的灯最后是关着的。
因为是从 2 开始按的, 所以如果一个数有偶数个因子那就会被按奇数次,如果有奇数个因子就会被按偶数次。
所以转化为求 [a, b] 内有偶数个因子的数
这就会涉及到质因子分解定理,即任何正数都能被分解成多个质数的幂次乘积的形式
N=(p[1] ^ e[1])(p[2] ^ e[2])……(p[k]^e[k]),其中p[i]是质数,e[i]是p[i]的幂次。而由这个公式我们又可以导出一个数有多少个因子的计算公式:FactorNumber(N)=(e[1]+1)(e[2]+1)……(e[k]+1)。
因为 奇 * 奇 = 奇, 奇 * 偶= 偶, 偶 * 偶 = 偶,显然判断奇数 FactorNumber(N) 比判断偶数 FactorNumber(N) 简单
那么什么条件下满足FactorNumber(N)是奇数呢?显然必须所有的e[1],e[2],……,e[k]都必须是偶数,这样才能保证e[i]+1是奇数,结果乘积才能是奇数。而由于e[1],e[2],……,e[k]都是偶数,那么N一定是一个完全平方数(因为sqrt(N)=(p[1] ^ (e[1]/2)) ( p[2] ^ (e[2]/2))……*(p[k]^(e[k]/2))是整数) 。
回到按灯泡的问题上来,最后编号为完全平方数的灯关着的, 非完全平方数的灯是开着的
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <math.h>
#include <algorithm>
#include <queue>
#include <map>
#define mod 1000000007
using namespace std;
typedef long long ll;
const int N = 106;
const long long inf = 0x3f3f3f3f;
const double eps = 1e-5;
const double pi = acos(-1);
int main()
{
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
int ans = 0;
for(int i = a; i <= b; ++i)
{
int tp = sqrt(i);
if(tp*tp != i) //不是完全平方数
++ans;
}
printf("%d\n", ans);
return 0;
}
来源:CSDN
作者:zhiaifangao
链接:https://blog.csdn.net/xiongshuxian2019/article/details/104491324