数学技巧

题目链接:http://59.69.128.200/JudgeOnline/problem.php?pid=216

    题目意思很简单,就是求满足 N = i * j + i + j (0 < i <= j) 的情况有多少组,由于数据量比较大,简单的模拟肯定超时,故可以观察等式,我们会发现可以在两边同时加上1,等式变为N+1=(i+1)*(j+1);你是否是这样想的设两个变量i,j两重循环,结果可想而知TLe,我们可以这样用(N+1)%(i+1)看是否可以整除,并且要注意这个限制i<=j,如果for循环使用(1到n的话)在里边加判断是不行的,还会超时,这还要我们观察,我们会发现其实没必要到n其实到n开平方就可以了。

    在以后的做题中,要这样问自己,这是最优的方法吗?还可以简化吗?能不能减少执行的次数。

View Code
#include <iostream>
#include
<cmath>
using namespace std;
int main()
{
int k,sum,j,n;
cin
>>k;
while (k--)
{
cin
>>n;
n
++;
sum
=0;
for(j=2;j<=sqrt(n);j++)
if(n%j==0)
sum
++;
cout
<<sum<<endl;
}
return 0;
}
posted @ 2011-06-29 12:06  我们一直在努力  阅读(162)  评论(0编辑  收藏  举报