我已经给了一个跟踪' 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);
}
}
答案 0 :(得分:1)
所以我猜你想要正矩阵元素和行列式&gt; 0
跟踪的可能值为[1, n - 1]; [2, n - 2] ...
,因此n -1
值。
我们将检查每个(O(n) checks
)中的每一个,我们可以用多少种方式填充矩阵的其余元素,使得行列式保持正数。
让矩阵为:
a1 a3
a4 a2
然后,行列式为a1*a2 - a3*a4
。对于固定的a1
和a2
,请从a3
到1
重复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] = 103
。 l
最后会是什么?您能找到10
,103
与l
的最终值之间的关系吗?这将是你的公式。
答案 1 :(得分:0)
您的问题是众所周知的整数分区问题的专业化。 p(n)是将n写为正整数之和的方式的数量(顺序无关紧要),p(n,k)是将n写为k个整数之和的方式的数量。你的问题从p(n,2)开始,并增加了一些额外的条件。关于整数分区算法的文献很多,你应该从其中一个开始。 但是,请注意整数分区是NP完全的,因此随着n的增长它会迅速发散。