hdu2601 An easy problems(数学思维)

题意
给你一个 N N ,让你找 N = i j + i + j N = i * j + i + j 这样 ( i , j ) (i,j) 的对数。
思路:
N的范围比较大,1e10,暴力肯定超时。
如果只枚举一个的话,那就太好了。
N = i j + i + j = ( i + 1 ) ( j + 1 ) 1 N = i * j + i + j=(i+1)(j+1)-1
N + 1 = ( i + 1 ) ( j + 1 ) N+1=(i+1)(j+1)
这样我们就可以在 O ( N ) O(\sqrt{N}) 复杂度下找出所有对数。

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
#define ll long long
const int N = 1e6+10 ;
int main(){
   int t;
   cin >> t;
   while(t--){
      ll n;
      scanf("%lld",&n);
      ll sum = 0;
      for(ll i = 1;i <= sqrt(n) + 1;++i){
         if((n+1) % (i + 1) == 0) {
            ll k = (n+1) / (i + 1);
            if((k - 1) >= i) sum ++;
           // cout<<i<<' '<<k-1<<endl;
         }
      }
      printf("%lld\n",sum);
   }
}
发布了632 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104087997
今日推荐