题解
可以发现(I, V, X, L)分别代表(1,5,10,50)时与分别代表(0,4,9,49)时方案数并无区别,只需在每一个原方案上减(n)即可。但是(0,4,9,49)分别互质且有(0)存在,分类讨论起来会容易很多,因此我们按照(0,4,9,49)考虑。
容易发现,在组合过程中会出现许多重复方案,为了避免方案重复,我们需要找出什么时候两组不同的数字的和相同:①(4 imes 9=9 imes 4);②(49 imes 9=9 imes 49) ;③(8 imes 4+1 imes 49=9 imes 9);④(5 imes 9+1 imes4=1 imes 49)。
为了统一标准,在允许的范围内我们尽量满足较大的数。由①得(4)的个数不能超过(8)个,由②得(9)的个数不能超过(48)个,由③得如果不取(4),(9)的个数不能超过(8)个,由④得如果取(4),(9)的个数不能超过(4)个。
设(4)取了(i)个,(9)取了(j)个,而剩下的(n-i-j)个数用(49)和(0)填充即可,一共有(n-i-j+1)种方案((49)可以取(0,1,2,...,n-i-j)个)
这样来看,循环的上界便很低了。而且在循环跑满的时候,答案会有规律地增长,因此也可以打表找规律解题。
AC代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int n,ans=0;
scanf("%lld",&n);
//枚举4的个数
for(int i=0;i<=min(8ll,n);i++)
{
//枚举9的个数
int qwq=(i==0)?8:4;
for(int j=0;j<=min(qwq,n-i);j++) ans+=(n-i-j+1);
}
printf("%lld",ans);
return 0;
}