字符串哈希 - HDU-1496 整数哈希

题目链接:
题目大意:
题意:给出方程a(x1 ^ 2)+b(x2 ^ 2)+c(x3 ^ 2)+d(x4 ^ 2)=0的系数abcd,求共有多少组正整数解(x1, x2, x3, x4)。
a, b, c, d=[-50,50]
x1, x2, x3, x4=[-100,0)and(0, 100]

四重循环肯定T了。

因为平方有非负性,所以首先下面情况特判:

if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0)
{
    printf("0\n");
    continue;
}

我们把问题分开来:

a(x1 ^ 2)+b(x2 ^ 2) = -c(x3 ^ 2)+d(x4 ^ 2) )

二重循环[1 , 100]求出所有hash = a(x1 ^ 2)+b(x2 ^ 2)的可能值。因为hash最大为 50 *10000 + 50*10000 =1000000,所以用vis标记。

再求[1 , 100] -c(x3 ^ 2)+d(x4 ^ 2) )的和,与vis匹配就行了,时间复杂度O(n^2)

结果*16 因为每个x可以取得负号。 2^4=16
#include <bits/stdc++.h>

using namespace std;
const int maxn=5000006;

int Hxz[1000010];
int Hxf[1000010];

int main()
{
    int a, b, c, d;
    while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF)
    {
        if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0)
        {
            printf("0\n");
            continue;
        }
        memset(Hxz, 0, sizeof(Hxz));
        memset(Hxf, 0, sizeof(Hxf));
        int s=0;
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                int ans=a*i*i+b*j*j;
                if(ans>=0)
                {
                    Hxz[ans]++;
                }
                else
                {
                    Hxf[-ans]++;
                }
            }
        }
        for(int i=1;i<=100;i++)
        {
            for(int j=1;j<=100;j++)
            {
                int ans=c*i*i+d*j*j;
                if(ans>0)
                {
                    s+=Hxf[ans];
                }
                else
                {
                    s+=Hxz[-ans];
                }
            }
        }
        printf("%d\n",s*16);
    }

    return 0;
}

全部评论

相关推荐

拒绝996的悲伤蛙:此贴终结|给路过的牛友分享一下心得👇 实习的时候不要光埋头干活,身边的大佬同事才是真·宝藏人脉!大胆请教他们工作以及职场上的问题以我的经历,我的带教有十几年工作经验,做过运维、后端开发、web测试,现在是高级软测,是行走的避坑指南 我之前纠结要不要学Web测试简历,被他一句话点醒:Web发展成熟,岗位需求在缩,AI对互联网的冲击可能以后架构+开发+测试一人包揽。现在用户更多用的是移动端APP/小程序,相比之下天天守着电脑刷网页的人基数小。 这里我的纠结得到反馈,于是我又把简历发给带教,获得了一对一的简历指导。 感兴趣的可以看看: 1.教育背景:本科→本科(全日制) 2.实习经历:总体问题不大,但第2点要稍作修改,可以写但做功课,如风机、水箱……可能会问用哪个供应商的?使用寿命、型号、电压电流、多少秒会触发逻辑? 3.项目经历(坑太多,大型翻车现场): - 项目名越直白越好,让人一眼就知道你干了啥。 -用的什么语言设计核心接口,异步执行做功课,涉及线程问题,被问可回答n个功能是如何错开异步执行的 - “验证任务消费……阻塞丢包”“高负载稳定性”这种词,没三五年开发功底不要写,不然面试时被问线程、数量级、CPU占用,内存带宽等影响性能的直接原地社死。 -做功课 -做功课,测了哪些模块,如何设计,接口流量抓包,token,变量…… -做功课,要熟悉网络协议…… 带教之前做互联网开发的时候面试过很多人,总的来说不要为了显得项目高大上过渡包装,写了就要做好拷打的准备
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
爱刷美剧的菠萝蜜巴比...:丢给gpt,让他优化实习 切合实际 突出产出 可以不局限简历内容,,然后就背就好了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务