zoukankan      html  css  js  c++  java
  • test20181020 B君的第一题

    题意


    分析

    二次剩余问题。

    x,y相当于二次方程

    [x^2-bx+c=0 mod{p} ]

    的两根。

    摸意义下的二次方程仍然考虑判别式(Delta=b^2-4c)

    它能开根的条件是(Delta=0)(Delta^{frac{p-1}{2}}=1)

    若能开根,则根为(Delta^{frac{p+1}{4}})

    然后就是普通的解一元二次方程了。

    代码

    #include<cstdlib>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<list>
    #include<deque>
    #include<stack>
    #include<queue>
    #include<map>
    #include<set>
    #include<bitset>
    #include<algorithm>
    #include<complex>
    #include<cassert>
    #define rg register
    #define il inline
    #define co const
    #pragma GCC optimize ("O0")
    using namespace std;
    template<class T> il T read()
    {
        T data=0;
    	int w=1;
        char ch=getchar();
        while(!isdigit(ch))
        {
    		if(ch=='-')
    			w=-1;
    		ch=getchar();
    	}
        while(isdigit(ch))
            data=10*data+ch-'0',ch=getchar();
        return data*w;
    }
    template<class T> il T read(T&x)
    {
    	return x=read<T>();
    }
    typedef long long ll;
    const int INF=0x7fffffff;
    
    const int mod=1e9+7;
    
    int qpow(int x,int k)
    {
    	int res=1;
    	while(k)
    	{
    		if(k&1)
    			res=(ll)res*x%mod;
    		x=(ll)x*x%mod,k>>=1;
    	}
    	return res;
    }
    
    int main()
    {
      freopen("lanzhou.in","r",stdin);
      freopen("lanzhou.out","w",stdout);
    	int T;
    	read(T);
    	while(T--)
    	{
    		int b=read<int>(),c=read<int>();
    		int d=((ll)b*b-(ll)4*c)%mod;
    		if(d<0)
    		{
    			d+=mod;
    		}
    //		cerr<<"d="<<d<<endl;
    		if(d!=0&&qpow(d,(mod-1)/2)!=1)
    		{
    			puts("-1 -1");
    		}
    		else
    		{
    			int r=qpow(d,(mod+1)/4);
    			assert((ll)r*r%mod==d);
    			int x=(ll)(b+r)*qpow(2,mod-2)%mod;
    			int y=(ll)(b-r)*qpow(2,mod-2)%mod;
    			if(x<0)
    			{
    				x+=mod;
    			}
    			if(y<0)
    			{
    				y+=mod;
    			}
    			if(x>y)
    			{
    				swap(x,y);
    			}
    			printf("%d %d
    ",x,y);
    			assert(x<=y&&(x+y)%mod==b&&(ll)x*y%mod==c);
    		}
    	}
    //  fclose(stdin);
    //  fclose(stdout);
        return 0;
    }
    
    静渊以有谋,疏通而知事。
  • 相关阅读:
    人工智能数学基础笔记(上)
    人工智能简介
    十三,十四 基金收益,税收与基金国际化
    资产配置模型之-BL模型
    十二 基金估值,费用与会计核算
    十一 基金的投资交易与结算
    十 基金业绩评价
    九 投资风险管理
    浙工商oj ___飞龙的飞行方程
    hd1004解题思路
  • 原文地址:https://www.cnblogs.com/autoint/p/9835519.html
Copyright © 2011-2022 走看看