cf 493 div.1 B

题意:

给出1,5,10,50,问用n个的和可得多少个数(不计顺序)

n <= 1e9

题解:

首先n确定,不妨都减一得到0,4,9,49

然后考虑用最小表示法去重。因为超过9个4可以被若干个9和若干个0替代,所以4的个数不可能超过8。

同理,枚举4和9总共选多少个,但sum-49 *n已经计算过的要舍去,统计答案即可

还有一种方法是打表,发现n>=12答案线性,然后用n=12和n=13推公式


#include<bits/stdc++.h>
using namespace std;
#define maxn 10020

int n,cnt;
long long ans;
int vis[maxn];

struct node{
	int d,cnt;
	bool operator < (node a)const{
		return d < a.d;
	}
}dt[maxn];
int dfs(int x){
	if ( x < 0 ) return 0;
	if ( vis[x] ) return 1;
	return dfs(x - 49);
}
int main(){
	scanf("%d",&n);
	for (int i = 0 ; i <= 8 ; i++){
		for (int j = 0 ; j <= 49 ; j++){
			if ( i + j > n ) continue;
			int x = i * 4 + j * 9;
			dt[++cnt] = (node){x,i + j};
		}
	}
	sort(dt + 1,dt + cnt + 1);
	for (int i = 1 ; i <= cnt ; i++){
		int x = dt[i].d , c = dt[i].cnt;
		if ( !dfs(x) ) ans += n - c + 1; //从小到大枚举,dfs时才不会出锅
		vis[x] = 1;
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42484877/article/details/80895730
今日推荐