zoukankan      html  css  js  c++  java
  • SGU 140. Integer Sequences 线性同余,数论 难度:2

    140. Integer Sequences

    time limit per test: 0.25 sec. 
    memory limit per test: 4096 KB

     

    A sequence A is called an integer sequence of length if all its elements A1 A2 .. AN are non-negative integers less than 2 000 000 000. Consider two integer sequences of length NA and X. The result of their multiplication (A*X) is an integer number R=A1*X1 + A2*X2 + .. + AN*XN. Your task is to solve the equation A*X=B (mod P), given the integer sequence A and the integer numbers B and P.

     

    Input

    The first line contains the integer numbers N (1<=N<=100) - the length of the integer sequences - P (1<=P<=10 000) and B (0<=B<=P-1). The second line contains the elements of the sequence A, separated by blanks: A1 A2 .. AN.

     

    Output

    You should print one line containing the word "YES" if there exists at least one integer sequence X which is a solution to the equation, or print "NO" otherwise. If the answer is "YES", the next line should contain N non-negative integers separated by blanks: X1 X2 .. XN.

     

    Sample Input #1

    2 7 4
    7 3
    

    Sample Output #1

    YES
    0 6
    

    Sample Input #2

    3 10 1
    2 4 6
    

    Sample Output #2

    NO
    线性同余方程,不断使前k个项余p得到最大公约数,同除去最大公约数,逆推即可
    #include <cstdio>
    using namespace std;
    int extgcd(int a,int b,int& x,int& y){
    	if(a==0){
    		x=0;y=1;
    		return b;
    	}
    	int t=extgcd(b%a,a,x,y);
    	int temp=x;
    	x=y-b/a*x;
    	y=temp;
    	return t;
    }
    int num[110],x[110],y[110];
    int main(){
        int cgcd,n,p,b;
        scanf("%d%d%d",&n,&p,&b);
        for(int i=0;i<n;i++){
            scanf("%d",num+i);
            num[i]%=p;
        }
        cgcd=num[0];
        for(int i=1;i<n;i++){
            cgcd=extgcd(cgcd,num[i],x[i],y[i]);
        }
        cgcd=extgcd(cgcd,p,x[n],y[n]);
        if(b%cgcd!=0)puts("NO");
        else {
            puts("YES");
            b/=cgcd;
            y[0]=1;
            for(int i=n-1;i>=0;i--){
                while(x[i+1]<0)x[i+1]+=p;
                b*=x[i+1];
                b%=p;
                while(y[i]<0)y[i]+=p;
                y[i]=y[i]*b%p;
            }
            for(int i=0;i<n;i++){
                printf("%d%c",y[i],i==n-1?'
    ':' ');
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    memcached 细究(一)
    centos文件/文件夹操作-检查磁盘、内存、cpu使用情况-vi操作命令
    判断php变量是否定义,是否为空,是否为真的一览表
    php 在函数前面加个@的作用
    apache Header set Cache-Control
    windows上memecache添加多个端口命令
    Android 4.4KitKat AudioFlinger 流程分析
    Android 4.4KitKat Sound System
    Android 4.4KitKat AudioTrack 流程分析
    Android Shell Cmd
  • 原文地址:https://www.cnblogs.com/xuesu/p/4042089.html
Copyright © 2011-2022 走看看