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;
}
posted @ 2021-01-01 21:33  violet_holmes  阅读(100)  评论(0编辑  收藏  举报