已退役


私信TA

用户名:15893197790

访问量:14398

签 名:

努力学习,积极生活。

等  级
排  名 389
经  验 5119
参赛次数 0
文章发表 43
年  龄 0
在职情况 学生
学  校 南京大学
专  业 计算机科学与技术

  自我简介:

已退役。研究生方向为AI+软件工程,欢迎学术交流!

解题思路:

方程组:

n1*a[1]+n2*b[1]+n3*c[1]=n4*d[1]

n1*a[2]+n2*b[2]+n3*c[2]=n4*d[2]

n1*a[3]+n2*b[3]+n3*c[3]=n4*d[3]

只把n1,n2,n3当作未知量,

解得n1=n4*(c[3]*b[2]*d[1]-c[2]*b[3]*d[1]-b[1]*c[3]*d[2]+b[1]*c[2]*d[3]-b[2]*c[1]*d[3]+b[3]*c[1]*d[2])/(a[1]*b[2]*c[3]-a[1]*b[3]*c[2]+a[3]*b[1]*c[2]-a[2]*b[1]*c[3]-a[3]*b[2]*c[1]+a[2]*b[3]*c[1])。这个其实并不难算,动一动手,不到10分钟就能算出来。

再根据轮换性将a改为b,b改为c,c改为a,就得到n2的解

                        a改为c,b改为a,c改为b,就得到n3的解

将n4从1到10000遍历,每次循环算出n1,n2,n3,再验证是否是整除(最简单的方法就是乘分子是否等于n4*分母)

over!

注意事项:

这种写法实际有缺陷,对于分母分子都为0的情况无法解决

比如:2 2 2

          2 2 2

          2 2 2

          2 2 2

不过这种情况概率太小了,数据集一般都给的是很大的奇奇怪怪的数字。
参考代码:

#include

using namespace std;

typedef long long ll;

ll d[4],a[4],b[4],c[4];

ll n4,n1,n2,n3;

ll k1,k2,k3,k4,k5,k6;//六个解方程的结果的常数

bool check(){

    n1=n4*k1/k2;

    if((n1*k2)!=(n4*k1))return false;

    n2=n4*k3/k4;

    if((n2*k4)!=(n4*k3))return false;

    n3=n4*k5/k6;

    if((n3*k6)!=(n4*k5))return false;

    if(n1<0||n2<0||n3<0)return false;

    return true;

}

int main(){

    for(int i=1;i<=3;i++)scanf("%lld",&d[i]);

    for(int i=1;i<=3;i++)scanf("%lld",&a[i]);

    for(int i=1;i<=3;i++)scanf("%lld",&b[i]);

    for(int i=1;i<=3;i++)scanf("%lld",&c[i]);

    k1=c[3]*b[2]*d[1]-c[2]*b[3]*d[1]-b[1]*c[3]*d[2]+b[1]*c[2]*d[3]-b[2]*c[1]*d[3]+b[3]*c[1]*d[2];

    k2=a[1]*b[2]*c[3]-a[1]*b[3]*c[2]+a[3]*b[1]*c[2]-a[2]*b[1]*c[3]-a[3]*b[2]*c[1]+a[2]*b[3]*c[1];

    k3=a[3]*c[2]*d[1]-a[2]*c[3]*d[1]-c[1]*a[3]*d[2]+c[1]*a[2]*d[3]-c[2]*a[1]*d[3]+c[3]*a[1]*d[2];

    k4=b[1]*c[2]*a[3]-b[1]*c[3]*a[2]+b[3]*c[1]*a[2]-b[2]*c[1]*a[3]-b[3]*c[2]*a[1]+b[2]*c[3]*a[1];

    k5=b[3]*a[2]*d[1]-b[2]*a[3]*d[1]-a[1]*b[3]*d[2]+a[1]*b[2]*d[3]-a[2]*b[1]*d[3]+a[3]*b[1]*d[2];

    k6=c[1]*a[2]*b[3]-c[1]*a[3]*b[2]+c[3]*a[1]*b[2]-c[2]*a[1]*b[3]-c[3]*a[2]*b[1]+c[2]*a[3]*b[1];

    bool flag=0;

    for(n4=1;n4<=10000;n4++){

        if(check()){

            flag=1;

            break;

        }

    }

    if(flag)printf("%lld %lld %lld %lld",n1,n2,n3,n4);

    else printf("NONE");

    system("pause");

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »