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 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;
}
原文地址:https://www.cnblogs.com/violetholmes/p/14220959.html