The lastest Math theory problem(最新的数学理论问题)

有一个正整数 N,满足 (N/a1) 等于 K1a1,(N/a2) 等于 K2a2,依此类推。然后,我要你告诉我最小的N。

输入

输入是整数 n(1<=n<=6),然后是上面描述的 n 个数字 ai(16 < ai < 10000)。

输出

如果存在这样的 N,输出 N mod 19880502,则改为 -1。

#include<cstdio>
#include<cstring>
#define ll __int64
ll M=19880502ll,A[6],B[6][9999];
int n,v[9999];
ll gcd(ll a,ll b)
{
    if(!b)return a;
	return gcd(b,a%b);
}
ll egcd(ll a,ll b,ll &x,ll &y)
{
    if(!b){x=1;y=0;return a;}
    ll d=egcd(b,a%b,x,y),t=x;
    x=y;
    y=t-a/b*y;
    return d;
}
ll Pow(ll a,ll b)
{
    ll r=1;
    while(b)
    {
        if(b&1)r=r*a%M;
        a=a*a%M;
        b>>=1;
    }
    return r;
}
ll sol(int k)
{
    ll x,y,t=B[0][k],m=A[0];
    for(int i=1;i<n;i++)
    {
        ll d=egcd(m,A[i],x,y),tp=B[i][k]-t;
        if(tp%d!=0)return -1;
        x=tp/d*x%A[i];
        if(x<0)x+=A[i];
        t=x*m+t;
        m=m/gcd(m,A[i])*A[i];
   }
    return t%m;
}
int main()
{
    while(~scanf("%d",&n))
    {
        memset(v,0,sizeof(v));
        memset(B,0,sizeof(B));
        for(int i=0;i<n;i++)
        {
            scanf("%I64d",A+i);
            ll tp=A[i];
            for(ll k=2;k*k<=tp;++k)
            if(tp%k==0)
            {
                v[k]=1;
                while(tp%k==0)
                {
                    ++B[i][k];
                    tp/=k;
                }
           }
           if(tp>1){v[tp]=1;B[i][tp]=1;}
        }
        ll res=1;
        for(int i=2;i<9998;i++)
        if(v[i])
        {
            ll t=sol(i);
            if(!~t){res=-1;break;}
            res=res*Pow((ll)i,t)%M;
        }
        printf("%I64d\n",res);
    }
}

 

这段代码是用C++编写的,主要用于解决一类数学问题,更具体地说,是解决关于模线性方程组的问题。这个方程组的未知数是一些整数,系数是给定的整数,并且方程的结果对某个大整数取模。

以下是代码的主要部分:

  1. gcd(ll a,ll b):这个函数用于计算两个整数a和b的最大公约数。
  2. egcd(ll a,ll b,ll &x,ll &y):这个函数用于计算a和b的最大公约数,并返回x和y,使得ax+by=gcd(a,b)。
  3. Pow(ll a,ll b):这个函数用于计算a的b次方对M取模的结果。
  4. sol(int k):这个函数用于解决模线性方程组。这里的k是方程中的一个未知数。
  5. main():主函数首先读取n,然后读取n个整数A[i]。接下来,对于每个A[i],它找到所有的因子,并将它们存储在B[i][]中。然后,对于每个因子k,它调用sol(k)函数找到解决方案。最后,它将所有的解决方案相乘,并打印出结果。

在模线性方程组的解决方案中,x可能是一个负数,因此代码使用了取模运算来确保x是一个非负数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值