两边平方,显然i+j+2sqrt(i * j)= k;
易知,ij为完全平方数,此题转化为<n有多少完全平方数,这些完全平方数各有多少因子。
单就此题而论不需要什么操作,我当时由于以为多组数据,所以加了个约数个数定理、唯一分解定理来求约数个数
TLE七发,发现原来不需要加scanf T。
^~~^说着说着眼泪就下来了,特就一起贴上去,供参考,也方便我以后找代码。
NUM改改能用的哈,就是NUM以内的素数,一般为你所需要的数的开方就够了
#include <bits/stdc++.h>
using namespace std;
#define NUM 100000
int a[9595],b[6325];
bool is_prime[NUM + 1];
long long int fun(long long n)//求取因子个数
{
long long int ans = 1,sum;
for(int i = 0; a[i]*a[i]<=n; i++)
if(n % a[i] == 0)
{
sum = 0;
while(n % a[i] == 0)
sum++, n /= a[i];
ans *= (sum+1);
}
if(n > 1) ans *= 2;
return ans;
}
void INIT()//初始化
{
for (int m = 2; m < NUM; m++) is_prime[m] = true;
for(int i = 2; i <= NUM; i++)
if(is_prime[i])
for(int j = 2 * i; j < NUM; j += i)
is_prime[j] = false;
for(int i = 2,k=0; i <= NUM; i++)
if(is_prime[i]) a[k]=i,k++;
//素数初始化完成
for (int i = 0; i < 6325; ++i)b[i]=fun(i*i+2*i+1);//所需平方数初始化
}
int main()
{
INIT();
int n,t=0;
scanf("%d",&n);
for (int i = 0; i < sqrt(n); ++i) t+=b[i];
printf("%d\n",t );
return 0;
}

京公网安备 11010502036488号