题目链接
https://codeforces.com/problemset/problem/998/D
解题思路
哇,我还搞数学公式啥的,发现自己错误的证明出没有重复的了……
打表找规律
大佬思路:
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; ll a[]={1,4,10,20,35,56,83,116,155,198,244,292}; ll n; int main() { cin>>n; if(n<=11) cout<<a[n]<<endl; else cout<<a[11]+(n-11)*49<<endl; return 0; }
打表代码
#include<bits/stdc++.h> #define int long long using namespace std; int vis[5010],cnt[110],cntt; signed main() { for(int i=0;i<=100;i++) { for(int j=0;j<=i;j++) for(int k=0;k<=i-j;k++) for(int t=0;t<=i-j-k;t++) vis[j*1+k*5+t*10+(i-j-k-t)*50]=1; for(int j=0;j<=50*i;j++) if(vis[j]) cnt[i]++,cntt++; cout<<cntt<<' '<<(i>=1?cnt[i]-cnt[i-1]:0)<<endl; cntt=0; memset(vis,0,sizeof vis); } for(int i=0;i<=11;i++) cout<<cnt[i]<<','; }
总结
我觉得这道题最应该学的是做题方法,
看到这么大的数据应该想到可以直接输出答案,要不有规律要不是数学公式,
当自己发现数学公式不会或者不对的时候,就应该尝试一下打表。