题目链接

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]<<',';    
}

总结

我觉得这道题最应该学的是做题方法,
看到这么大的数据应该想到可以直接输出答案,要不有规律要不是数学公式,
当自己发现数学公式不会或者不对的时候,就应该尝试一下打表。