数学技巧
题目链接: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开平方就可以了。
在以后的做题中,要这样问自己,这是最优的方法吗?还可以简化吗?能不能减少执行的次数。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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;
}