hd1496---->这道题是水水的数论吗?

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1496

题意:

Consider equations having the following form:
a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.
It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.
Determine how many solutions satisfy the given equation.

这道题很水吗? 然而小恪并不这么认为, 可能是小恪太水啦!。 虽然此题思路很简单, 但是却有两个技巧值得学习!(也许机智的你, 早已熟知这两个技巧)。

第一步:         变换公式 --> a*x1^2+b*x2^2=-c*x3^2-d*x4^2    (好像变换的很白痴, 好像并没有什么卵用!)

第二步:          我们定义一个常数 shift 则:  -->a*x1^2+b*x2^2+shift=-c*x3^2-d*x4^2+shift。(好像更没什么卵用!,,,,,,)

第三步:          直接看代码, 你就会明白。会明白这题虽然简单但是真的很机智!

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int MAXN = 2e6+10;
const int shift = 1e6;
int f[MAXN];

int main()
{
    int a, b, c, d;
    while(cin>>a>>b>>c>>d)
    {
        int i, j, k, ans = 0;
        if(a<0&&b<0&&c<0&&d<0||a>0&&b>0&&c>0&&d>0)
        {
            cout<<0<<endl; continue;
        }
        memset(f, 0, sizeof(f));
        for(i=1; i<=100; i++)
        for(j=1; j<=100; j++)
        f[a*i*i+b*j*j+shift]++;
        for(i=1; i<=100; i++)
        for(j=1; j<=100; j++)
        ans+=f[-c*i*i-d*j*j+shift];
        cout<<ans*16<<endl;
    }
    return 0;
}

/*
    数论,
    变换公式-->a*x1^2+b*x2^2=-c*x3^2-d*x4^2-->a*x1^2+b*x2^2+shift=-c*x3^2-d*x4^2+shift。
    分别枚举x1,x2用哈希表记录左式的所有值,再相同方法哈希右式,将相同的值得哈希值加入答案即可。
    由于值可能为负,会数组溢出,所以加个偏移值shift
*/  

代码中的f[]竟然就是哈希表, 看来哈希表也不全是复杂的哦! 这个哈希表好亲民啊, 而且用的好机智。另外 shift 用的也好机智哦!

时间: 2024-12-10 09:37:03

hd1496---->这道题是水水的数论吗?的相关文章

POJ1061青蛙的约会

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

codevs 1200:同余方程

题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. 输出描述 Output Description 输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解. 样例输入 Sample Input 3 10 样例输出 Sample Output 7 数据范围及提示 Data Size & Hint [数据范围]对于 40%  的数

--数论-&gt;被想复杂的一道题

计算 n/1 + n/2 + n/3 +n/4 + ... + n/n =? 一开始的思路是将n提取出来 : 原式 = n* (1+ 1/2 + 1/3 + 1/4 + ... 1/n)  = n * (ln(n) + c) c是欧拉常数 ,约为0.5772,样例挂 然后发现这样会多加上那些没被整除的被省略的分数,比如 2/3 = 0,但是在上面的式子里分数也是算上的,再次去bug,找出多加的数就行了 没实现... 从网上一看,远没有那么难! 然后自己敲过了: #include<stdio.h>

CodeForces 396A 数论 组合数学

题目:http://codeforces.com/contest/396/problem/A 好久没做数论的东西了,一个获取素数的预处理跟素因子分解写错了,哭瞎了,呵呵, 首先ai最大值为10^9,n为500,最坏的情况 m最大值为500个10^9相乘,肯定不能获取m了,首选每一个ai肯定是m的一个因子,然后能分解就把ai给分解素因子,这样全部的ai都分解了  就能得到m的 所有素因子 以及 所有素因子的个数,题目求的 是n个因子的 不同序列的个数,所以每次 只能选出n个因子,这n个因子由素因子

hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542 小明系列故事--未知剩余系 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 889    Accepted Submission(s): 207 Problem Description "今有物不知其数,三三数之有二,五五数之有三,七七数之有

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

BZOJ 1406 [AHOI2007]密码箱 数论

题意:链接 方法:数论 解析: 对于这道题,假设n=a*b;然后b是较大的因子 之后怎么来想呢? 之后就是根号找因子,找到每个a,b,之后从0~n枚举b的倍数. 因为x2?1=0(mod n) 所以(x?1)?(x+1)=0(mod n) 因为我们枚举的数就是k1*b,所以我们只要讨论一下,k1*b是等于x-1还是x+1就好了,之后就是判断下边界什么的就把所有的可能值加到一个set里!千万不要犯傻加到map里!!千万不要!!不要认为map啥都能干!! 之后因为set内元素的唯一性.直接输出内部所

UVA 10791 Minimum Sum LCM (数论)

LCM (Least Common Multiple) of a set of integers is defined as the minimum number, which is a multiple of all integers of that set. It is interesting to note that any positive integer can be expressed as the LCM of a set of positive integers. For exa

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人