题意:

求 1—n 中,有多少个数的因子和是偶数。

题解:

下面这个题解可能到后面就看不懂了,我对其做一下解释: 1.只有奇数乘奇数是奇数,所以下面的思路最后是找到所有因子和为奇数的个数。 2. 如果p[i]==2,则p[i]^0 + p[i]^1 +.....+ p[i]^e[i]为奇数; 如果p[i]!=2,则p[i]一定为奇数(因为p肯定为素数)且p[i]^e[i]也为奇数(数乘奇数是奇数)。因为只有奇数+偶数=奇数,我们需要做到两两组合(奇数+奇数对于偶数),剩下一个奇数(奇数+偶数=奇数),所以e[i]要保证为偶数。 3. e[i]为偶数,所以一定可以化简为某个数的平方,所以只要找出n以内的平方数就能够找出所有的满足第二个条件的个数,再加上第一个函数,有一个质因子是2,所以在平方数乘以二倍即可即2x^2.

LightOJ 13361336 - Sigma Function (找规律 + 唯一分解定理)_#include

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
#define kuaidian ios::sync_with_stdio(0);
using namespace std;
typedef long long ll;
int main()
{
ll n;
int t;
scanf("%d",&t);
int cas=0;
while(t--)
{
scanf("%lld",&n);
ll a1=sqrt(n);
ll a2=sqrt(double(n/2));
printf("Case %d: %lld\n",++cas,n-a1-a2);
}
return 0;
}