zoukankan      html  css  js  c++  java
  • UVA408-水的深度的伪随机数

    题意:

    公式sed(x) = (sed(x-1)+step)%mod,初始值sed(x)=0,输入step和mod,求解这个公式能不能生成0,1,2,3,4,5.....mod-1

    解法:暴力枚举,直到出现循环

    数学证明:

    假设step,和mod的最大公约数是m

    设step=km,mod=nm,(step<mod)

    第一次,(0+km)%nm

    sed(1)=km

    sed(2)=(sed(1)+step)%nm=(km+km)%nm=2km%nm=2km

    .........

    sed(x)=(sed(x-1)+step)%nm=xkm%nm

    如果xkm=nm,sed(x)=0,出现循环,出现的值都是,0,step,1step,2step,3step.....0,1step......,全是step的倍数,此时,如果step!=1,那么公式不能生成所有的数,如果step=1,那么就能生成所有的数,

    此时,step和mod 的最大公约数是 1,等于step

    如果xkm>nm

    sed(x)=xkm%nm,因为xkm>nm,所以,xk>n,所以xk中肯定可以找出一个n,所以sed(x)=xkm%nm=(xk-n)m

    sed(x+1)=(sed(x)+step)=((xk-n)m+km)%nm=(xkm-nm+km)%nm=(xkm%nm+km%nm)%nm=((x+1)km)%nm=((x+1)k-n)m

    ...........

    都是m的整数倍.

    求最大公约数,0ms

    #include<iostream>
    #include <stdio.h>
    #include <memory.h>
    using namespace std;
    
    int gcd(int a,int b)
    {
    	return b?gcd(b,a%b):a;
    }
    int main()
    {
    
    	int step, mod;
    	while (cin >> step >> mod)
    	{
    
    		printf("%10d%10d", step, mod);
    		if(gcd(step,mod)==1)
    		{
    			printf("    Good Choice
    ");
    		}
    		else
    		{
    			printf("    Bad Choice
    ");
    		}
    		printf("
    ");
    	}
    
    	return 0;
    }
    

      暴力枚举,40ms

    #include<iostream>
    #include <stdio.h>
    #include <memory.h>
    using namespace std;
    
    int main()
    {
    	
    	int step, mod;
    	while (cin >> step >> mod)
    	{
    		int* used = new int[mod];
    		memset(used, 0, sizeof(int)*mod);
    		int sed = 0;
    		while (used[sed] != 1)
    		{
    			used[sed] = 1;
    			sed = (sed + step) % mod;
    		}
    		int n = 1;
    		for(int i = 0; i < mod; i++)
    		{
    			if(used[i] == 0)
    			{
    				n = 0;
    				break;
    			}
    		}
    		printf("%10d%10d", step, mod);
    		if(n)
    		{
    			printf("    Good Choice
    ");
    		}
    		else
    		{
    			printf("    Bad Choice
    ");
    		}
    		printf("
    ");
    	}
    
    	return 0;
    }
    

      

  • 相关阅读:
    C++ mutex&&RWlock
    一个资源池模型
    C++安全编码摘录
    C++点滴
    git常用命令(转)
    ASN.1
    TDOA泰勒级数法
    teamviewer解除最大通话限制-特别破解版(转)
    剑指offer——旋转数组的最小数字
    常见的相关分析方法——结合实例
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6844152.html
Copyright © 2011-2022 走看看