hdu 1681 Frobenius 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1681
background knoledge:啥叫线性表示?就是 有一个给定的数列a1,a2,……,an,如果能够找出一组数w1,w2,……,wn,使得p=w1*a1+w2*a2+……+wn*an,那么就说p能被a1~an这一组数线性表示,而w1,w2,……wn这一组数叫做一组特解。
题目大意:(题名为弗洛贝尼乌斯,是否与弗洛贝尼乌斯定理有关暂不明)给出a1,a2,……,an共n个数,定义最大的不可被这n个数线性表示的数为弗洛贝尼乌斯数,记为F(a1,a2,……,an)。本题要求的是百万以内有多少个不可被给定的四个数线性表示的数,以及百万内是否存在最大的弗洛贝尼乌斯数(是就输出它,否就输出-1)。
题目分析:顺着推就行,要找最大的数是否在百万以内,可以推到百万零一万(因为给定的四个数都不大于一万),再找上面有没有。
code:
#include<cstdio>
#include<cstring>
bool dp[1010010];
int main()
{
int i,a[5],t,count,mem;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d",a,a+1,a+2,a+3);
memset(dp,false,sizeof(dp));
dp[a[0]]=dp[a[1]]=dp[a[2]]=dp[a[3]]=1;
for(count=0,i=1;i<1000001;i++)
{
if(dp[i])
{
dp[i+a[0]]=dp[i+a[1]]=dp[i+a[2]]=dp[i+a[3]]=1;
}
else count++,mem=i;
}
for(;i<1010000;i++)
{
if(!dp[i])mem=-1;
else
{
if(i+a[0]<1010000)dp[i+a[0]]=1;
if(i+a[1]<1010000)dp[i+a[1]]=1;
if(i+a[2]<1010000)dp[i+a[2]]=1;
if(i+a[3]<1010000)dp[i+a[3]]=1;
}
}
printf("%d\n%d\n",count,mem);
}
return 0;
}
PS:感觉这次代码写的挺烂的……可能是心态不好