码迷,mamicode.com
首页 > 其他好文 > 详细

习题:Guess the Root(高斯消元)

时间:2020-07-20 00:01:31      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:就是   ret   f11   lan   ++   root   高斯消元   out   cout   

题目

传送门

思路

阿这

基本上就是暴力用高斯消元来搞就行了

因为\(mod\)很小,所以可以直接枚举\(x\)

代码

#include<iostream>
using namespace std;
const int mod=1e6+3;
int n=11;
long long a[15][15];
long long f_abs(long long x)
{ 
    return x<0?-x:x;
}
long long qkpow(int a,int b)    
{
    if(b==0)
        return 1;
    if(b==1)
        return a;
    long long t=qkpow(a,b/2);
    t=t*t%mod;
    if(b%2==1)
        t=t*a%mod;
    return t;
}
int main()
{
    for(int i=1;i<=n;i++)
    {
        cout<<"? "<<i-1<<endl;
        cin>>a[i][n+1];
        for(int j=1;j<=n;j++)
            a[i][j]=qkpow(i-1,j-1); 
    }
    for(int i=1;i<=n;i++)
    {
        int _ind=i;
        for(int j=i+1;j<=n;j++)
            if(f_abs(a[j][i])>f_abs(a[_ind][i]))
                _ind=j;
        swap(a[_ind],a[i]);
        if(a[i][i]==0)
        {
            cout<<"! -1";
            return 0;   
        }
        for(int j=1;j<=n;j++)
        {
            if(j!=i)
            {
                long long t=a[j][i]*qkpow(a[i][i],mod-2);
                for(int k=i+1;k<=n+1;k++)
                {
                    a[j][k]=((a[j][k]-t*a[i][k])%mod+mod)%mod;
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    { 
        a[i][i]=a[i][n+1]*qkpow(a[i][i],mod-2)%mod;
	} 
	for(int i=0;i<mod;i++)
    {
        long long t=0;
        for(int j=1;j<=n+1;j++)
        {
            t=(t+qkpow(i,j-1)*a[j][j]%mod)%mod;
            //cout<<qkpow(i,j-1)<<‘ ‘<<a[j][j]<<endl;
        }
        //cout<<endl;
        if(t==0)
        {
            cout<<"! "<<i;
            return 0;
        }
    }
    cout<<"! -1";
    return 0;
}

习题:Guess the Root(高斯消元)

标签:就是   ret   f11   lan   ++   root   高斯消元   out   cout   

原文地址:https://www.cnblogs.com/loney-s/p/13341237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!