Roman Digits (暴力打表找規律)
阿新 • • 發佈:2018-12-23
題意:1,5,15,50四個數,可重複取不同的n個數組成一個代表的數
思路:規模為1e9,打表找規律(3個for迴圈,輸出答案),或者logn,發現後面都是等差數列遞增。題目具有技巧性,但是也值得思考背後的原理與積累,希望一段時間後還能會過來看看思考這道題。
程式碼:
#include<cstdio> #include<math.h> #include<string.h> #include<queue> #include<map> #include<set> #include<vector> #include<algorithm> #define ll long long #define mem(x,y) memset(x,y,sizeof(x)); #define pi acos(-1.0) using namespace std; ll gcd(ll a,ll b){return b?gcd(b,a%b):a;} ll powmod(ll a ,ll b,ll mod){ll ans=1;while(b){if(b%2)ans=ans*a%mod;a=a*a%mod;b/=2;}return ans;} const int maxn=300006; int a[maxn][2]; char s[maxn]; int ss[maxn]; /* 題目特點: a+b+c+d=n; 求sum的答案的個數 sum=a*v[0]+b*v[1]+c*v[2]+d*v[3]; 1,5,15,50可以變成0,4,14,49 */ long long dfs(int x){ set<long long>st; for(int i=0;i<=x;i++){ for(int j=0;j+i<=x;j++){ for(int a=0;a+i+j<=x;a++){ long long b=x-i-j-a; long long num=i+j*5+10*a+50*b; st.insert (num); } } } return st.size (); } int main(){ long long n; scanf("%lld",&n); if(n<=20){ printf("%lld\n",dfs(n)); }else{ printf("%lld\n",dfs(20)+49*(n-20)); } }