CF997B Solution
题解
可以发现\(I, V, X, L\)分别代表\(1,5,10,50\)时与分别代表\(0,4,9,49\)时方案数并无区别,只需在每一个原方案上减\(n\)即可。但是\(0,4,9,49\)分别互质且有\(0\)存在,分类讨论起来会容易很多,因此我们按照\(0,4,9,49\)考虑。
容易发现,在组合过程中会出现许多重复方案,为了避免方案重复,我们需要找出什么时候两组不同的数字的和相同:①\(4\times 9=9\times 4\);②\(49\times 9=9\times 49\) ;③\(8\times 4+1\times 49=9\times 9\);④\(5\times 9+1\times4=1\times 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;
}