两边平方,显然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; }