题意:
罗马的一位数字可以表示1、5、10、50
问n位最多能有表示多少种不同的数字
数据范围:n<=1e9
解法:
数据范围太大,没什么好的办法,只好打表找规律了
发现当n>=12的时候,后面一项等于前面一项加49,是等差数列
打表程序:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
map<int,int>mark;
int a[]={1,5,10,50},len=4;
int n;
void dfs(int cur,int sum){
if(cur==n){
mark[sum]=1;
return ;
}
for(int i=0;i<len;i++){
dfs(cur+1,sum+a[i]);
}
}
signed main(){
for(n=1;n<=20;n++){
mark.clear();
dfs(0,0);
cout<<mark.size()<<",";
}
return 0;
}
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
map<int,int>mark;
int a[]={0,4,10,20,35,56,83,116,155,198,244,292,341},len=12;
signed main(){
int n;cin>>n;
if(n<=12){
cout<<a[n]<<endl;
}else{
cout<<a[12]+(n-12)*49<<endl;
}
return 0;
}