随机的点

描述 Description
陶陶为了给一道平面几何题出数据,需要产生 N 个点(x[i],y[i])。已知x,y是由伪随机函数顺序产生,即:
X[i+1] = (X[i]*Ax+Bx+i) mod Cx (X[1], Ax,Bx,Cx 是事先给定的)
Y[i+1] = (Y[i]*Ay+By+i) mod Cy (Y[1], Ay,By,Cy 是事先给定的)

这样,就可以快速连续产生很多点坐标(X[i], Y[i])。
不幸的是,这样产生的点有可能有相同的,虽然这种几率很少,但严谨的陶陶不允许这种事发生。陶陶要求你帮助他解决最少要产生前多少项时,正好有 N 个不相同的点。

输入格式 Input Format
第一行。一个整数 N .
第二行:4个整数 X[1]、 Ax、Bx、Cx .
第三行:4个整数 Y[1]、 Ay、By、Cy .

输出格式 Output Format
一个整数 M 。表示最少要连续产生 M 个点,正好有 N 个不相同的点。数据保证有答案。

样例输入 Sample Input
21
2 4 3 6
5 2 3 13

样例输出 Sample Output
24

时间限制 Time Limitation
1s

注释 Hint
1<=N<=1,000,000, 其它所有数据都在[0...1,000,000,000]范围内。

来源 Source
经典问题

      思路:对于刚学hash的焫鷄,书上给的模板是求一个数x的查找。但这道题是求一个坐标,有两个数怎么办呢??仔细一想回发现因为你用hash存的就是一个位置,所以你可以直接让(x+y)在取模那个大的质数,然后其他操作就和普通的hash一样了。然后你高高兴兴的把程序交上去。。。(超时???)听century一说,你必须的让x和y乘一个大数相加在取模,这是为什么呢??因为在你没有乘一个大数的时候刚开始的x,y相加取模的值也不会改变,所以你前面存的点就过于密集,导致查找时时间过慢,如果你乘上一个大数,就会使这个hash变得散,所以时间复杂度就大大降低了。然后你又兴冲冲的交了上去。。。。。(wrong answer???),你会发现x1,y1为零的点你的答案都加了一??这又是为什么呢??因为你刚开始给这个结构体付的值为0,所以刚开始他就判断x1,y1为零的点已经存在了,所以你只需手动付一下x的值为-1就好了

    

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int maxprime=2323237;
const int step=7;
struct shadow
{
    long long x,y,num;
}hash[maxprime+5];
int q,w;
int find(long long g,long long k)
{
    int temp=(g*499979+k*299993)%maxprime;
    while((hash[temp].num)&&(hash[temp].x!=g||hash[temp].y!=k))
    {
        temp+=step;
        if(temp>=maxprime)
            temp-=maxprime;
    }
    return temp;
}
int ans=0,h=0;
void insert(long long g,long long k)
{
    int now=find(g,k);
    if(hash[now].y==k&&hash[now].x==g)
        return;
    else
    {
        h++;
        hash[now].x=g;
        hash[now].y=k;
        hash[now].num=1;
    }
}
int main()
{
    //freopen("add.out","w",stdout);
    memset(hash,0,sizeof(hash));
    for(int i=0;i<=2323237+4;i++)
        hash[i].x=-1;
    int n;
    cin>>n;
    int x1,a1,b1,c1;
    cin>>x1>>a1>>b1>>c1;
    int y1,a2,b2,c2;
    cin>>y1>>a2>>b2>>c2;
    long long g=x1,k=y1;
    for(int i=1;;i++)
    {
        insert(g,k);
        g=(g*a1+b1+i)%c1;
        k=(k*a2+b2+i)%c2;
        //cout<<g<<‘ ‘<<k<<endl;
        ans++;
        if(h==n)
        {
            cout<<ans<<endl;
            break;
        }
    }
    return 0;
}

<( ̄ ﹌  ̄)>

时间: 2024-10-10 06:14:46

随机的点的相关文章

(漂浮?气泡?)js生成位置、颜色、透明度随机的字块

效果图如下: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatibl

java中Random随机种子使用

在java中,通过Random生成随机数时,如果设置随机种子,则相同的种子,产生的随机数相同.若不设置则每次随机的不同. Random rnd = new Random(); rnd.setSeed(10);//用于设置种子. rnd.nextInt();// 用于产生随机数. rnd.nextInt(10); // 产生(0-9)数字.

【统计学习】随机梯度下降法求解感知机模型

1. 感知机学习模型 感知机是一个二分类的线性分类问题,求解是使误分类点到超平面距离总和的损失函数最小化问题.采用的是随机梯度下降法,首先任意选取一个超平面w0和b0,然后用梯度下降法不断地极小化目标损失函数,极小化过程中不是一次使所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降.假设误分类点集合M是固定的,那么损失函数L(w,b)的梯度: 随机选取一个误分类点,对w和b进行更新: 其中n是步长,又称为学习率(learning rate),这样通过迭代可以使损失函数L(w,b)不

决策树 随机森林 adaboost

? 熵.互信息? 决策树学习算法 ? 信息增益 ? ID3.C4.5.CART? Bagging与随机森林? 提升 ? Adaboost/GDBT ? 熵.互信息 熵是对平均不确定性的度量. 平均互信息:得知特征Y的信息而使得对标签X的信息的不确定性减少的程度.描述随机变量之间的相似程度.(条件熵.相对熵:差异性) ? 决策树 决策树学习采用的是自顶向下的递归方法,有监督学习. 其基本思想是以信息熵为度量构造一棵熵值下降最快的树,到叶子节点处的熵值为零,此时每个叶节点中的实例都属于同一类. 建立

js里面随机抽取n个随机数

function getImageRandomPosition(){ do { var n = Math.floor(Math.random() * 12);//n为随机出现的0-11之内的数值 for (var i = 0; i < posArray.length; i++) { if (n == posArray[i]) { /*若n和数组里面的数值有重复,立即跳出函数*/ break; } } /*若n和数组里的数组无重复,那么i和数组的长度是相同的,这样可以避免出现重复的数字*/ if

判断随机生成的四则运算结果

功能:1.随机生成一个四则运算 2.用户输入式子结果后判断是否正确(结果取整) #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stack> using namespace std; int n,t,n1; struct ZX { char a; bool b;//if b=0 括号 if b=1 数字 } ; stack<ZX>s1; void atersz(ZX

机器学习中的算法(1)-决策树模型组合之随机森林与GBDT

版权声明: 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用,但请注明出处,如果有问题,请联系[email protected] 前言: 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的. 模型组合(比如

js选择颜色小游戏(随机生成不含重复数字的数组,通过数组中的数控制定义好的数组)

<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>js网页版小游戏</title> <style media="screen"> .wrap { width: 577px; outline: 1px solid hotpink; margin: 100px auto; box-shadow: 0 0 5px; } .

随机飞行找妈妈怎么用?

此项功能用于失散的羊号,由于高迁很少,随机迁移令有很多.可以用来飞行很多次到大号边上 哪怎么用呢? 第一, 你能知道今天是什么日期,如果不知道就可以关电脑了. 第二, 比如说今天是 2015-11-09 , 那么 验证日期,输入09 第三, 输入你大号的 x,y 坐标,注意这个不能搞错了 第四, 输入你想飞到大号距离多长时间,一般写 90分钟比较好 第五, 飞行次数,我们一次飞20次好了 第六, 关键的,要先暂停所有号运行. 第七, 可以点随机飞了 第八, 注意看左边的日志输出. 第九, 如果还

Nginx实现404页面跳转到任意随机页面

一.概述 很多时候我们访问一个网站,例如360,或者腾讯的页面,当该页面不存在的时候,会提示404未找到,然后右下角会出现 爱心帮助的 图片等,然后这些图片或者问题都是随机的,也许你下次访问的时候就是另外的页面了.现在我们通过nginx结合php来实现这么个需求. 二.配置 前提: LEMP环境(略) ①编辑nginx配置文件(/etc/nginx/nginx.conf)         location / {                     ###            if (!-