E.zy与魔法石
tag:模拟,贪心
cf分值:1400
出题人前言:本来想着这个题大家推出规律就可以直接模拟AC的,因为数据范围给的挺舒适,本来定位是签到题级别的。但是现场只有Aklice一个人过,作为出题人还是觉得很不满意的,很多人是题读错了。
解法:推出规律其实发现,n大小的背包想尽可能多装不同的数,所以只需要模拟就行,先从小到大(从2开始)塞,塞到足够大之后发现会有一些是多余的,这个时候再反向往前塞就行。注意一下当n=1时的特判。
std代码:
#include<bits/stdc++.h> using namespace std; const int mod=1e9+7; int main(){ int n; cin>>n; if(n==0){ cout<<0; return 0; } int temp=0,p=1; for(int i=2;i<=n;i++){ if(temp+i>n) break; temp+=i; p=i; } n-=temp; long long r=1; for(int i=p;i>=2;i--){ if(i==p && n-(p-1)>0) r=(r*(p+2))%mod; else if(n>0) r=(r*(i+1))%mod, n--; else r=r*i%mod; } cout<<r; }