图片说明
两边平方,显然i+j+2sqrt(i * j)= k;
易知,i
j为完全平方数,此题转化为<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;
}