[瞎搞]JZOJ 3096 Hash函数

本文探讨了一个基于Hash函数的算法在解决正方形个数问题时遇到的挑战。通过分析给定的Hash函数h=x*y+x+y,指出其存在的问题,并提供了一种新的解决思路,即通过求解h+1的因子个数来找到所有满足条件的(x,y)对。文章还附带了C++代码实现,用于计算给定h值下满足条件的(x,y)对的数量。
Description

    明明觉得hash是个好算法,代码短、效率高。某天,他碰到了一个求正方形个数的问题,于是很淡定地枚举对角线然后用hash判存在,妥妥的搞定,但是提交后却wa了几个点。仔细观察其hash函数为:h=x*y+x+y 。为了让明明知道这个函数存在什么问题,对于给出一个h值,请你来告诉他有多少对(x,y)满足上述式子(max(x,y)<=h;h,x,y都为非负整数)。


 

 
Input

多组测试数据,第一行为测试点的个数T,接下来每一行一个整数h,意义如上。


 

Output

    一共T行,每行一个整数,分别表示有多少组(x,y)满足要其对应的h值。


 

 
Sample Input
3
1
3
4
Sample Output
2
3
2
 
Data Constraint
 
 
Hint

【样例解释】


(1,0),(0,1)


(0,3),(1,1),(3,0)


(4,0),(0,4)


 


【数据范围】


对于30%数据 h<=20,000 , T<=1000


对于100%数据 h<=100,000,000 , T<=10000;

 

分析

式子随便搞一下就会发现是h+1=(x+1)(y+1)

那就求h+1的因子个数即可

 

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int h,t;

int main() {
    scanf("%d",&t);
    while (t--) {
        scanf("%d",&h);
        h++;
        int ans=0,st=sqrt(h);
        for (int i=1;i<=st;i++)
            ans+=h%i==0?(i*i==h?1:2):0;
        printf("%d\n",ans);
    }
}
View Code

 

转载于:https://www.cnblogs.com/mastervan/p/9867328.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值