有多少矩阵的痕迹等于givan trace?

时间:2014-04-12 20:05:43

标签: c algorithm matrix

我已经给了一个跟踪' n'矩阵。我想知道有多少矩阵(只有2 * 2阶),其轨迹等于' n'并且所有矩阵必须 正面 可逆,即它们的决定因素必须比'0'更重要。

For ex:
trace=3
No.of matrices=2

trace=4
No.of matrices=11

trace=5
No.of matrices=30

我已为此编写了一个代码,但效率不高,因为我的代码为n=1500成功输出,之后我超出了时间限制。 谁能帮我?

我的代码是:

#include<stdio.h>

int main()
{
    int t,n,nsot,i,j,l;
    int arr[2000],k;
    unsigned long long  sum1=0,sum2=0,sum=0;
    scanf("%d",&t);
    while(t--)
    {
        sum1=0;
        sum2=0;
        //sum=0;
        scanf("%d",&n);
        nsot=n/2;
        for(i=1;i<=nsot;i++)
        {
            arr[i]=i*(n-i);
            //printf("%d ",arr[i]);
            sum1=0;
                for(k=1;k<arr[i];k++)
                {
                    //printf("%f\n",ceil(arr[i]/k));
                    sum1=sum1+((arr[i] - 1) / k);

                }
                if(i==(n-i))
            sum=sum1;
            else
            sum=0;

            //printf("%d\n",sum);
            //printf("%llu",sum2);
            sum2=sum1+sum2;
        }
        printf("%llu\n",(2*sum2)-sum);
    }
}

2 个答案:

答案 0 :(得分:1)

所以我猜你想要正矩阵元素和行列式&gt; 0

跟踪的可能值为[1, n - 1]; [2, n - 2] ...,因此n -1值。

我们将检查每个(O(n) checks)中的每一个,我们可以用多少种方式填充矩阵的其余元素,使得行列式保持正数。

让矩阵为:

a1 a3
a4 a2

然后,行列式为a1*a2 - a3*a4。对于固定的a1a2,请从a31重复n - 1。然后你必须解决:

a1*a2 - x*a4 > 0
a1*a2 > x*a4
x < a1*a2 / a4

因此,您可以在x =&gt;中找到O(1)总复杂度O(n^2),应该非常快。

这似乎就是你正在做的事情,除了你最内层的循环使它O(n^3)(你还迭代x):

l=1;
while(k*l<arr[i])
{
    sum1++; 
    l++;
}

k = 10和arr[i] = 103l最后会是什么?您能找到10103l的最终值之间的关系吗?这将是你的公式。

答案 1 :(得分:0)

您的问题是众所周知的整数分区问题的专业化。 p(n)是将n写为正整数之和的方式的数量(顺序无关紧要),p(n,k)是将n写为k个整数之和的方式的数量。你的问题从p(n,2)开始,并增加了一些额外的条件。关于整数分区算法的文献很多,你应该从其中一个开始。 但是,请注意整数分区是NP完全的,因此随着n的增长它会迅速发散。