不会数论,也不会不定方程,冲浪看到的面试题,第一眼不会,后面想了一下做出来了,于是记一下。
以下除法都是向下整除:
1.枚举小于等于5的情况,可知答案为:全由z构成n(即z==n)+ 如果n大于等于2,就加上y为1时,全由z构成n-2的方案 + 如果n大于等于4,就加上y=2时,全由z构成n-4的方案 + 如果n大于等于5,就加上n-5的全由y和z构成的方案。
2.于是看出可以枚举x,然后全由y和z构成整数n的方案数是n/2 + 1。
3.设$f(x) = \frac{x}{2} +1$,答案为$$ans = \sum_{i=0}^{n/5} f(n-5*i)$$
4.如果没有向下整除,拿这玩意就是个等差数列求和,可以直接结束了。但是涉及到向下整除2,我们知道一定每一项是+2,+3,+2....或者是+3,+2,+3…这样分布的数列。那么就看成两个公差为5的等差数列求和,总共的项数是n/5+1。
第一项是$(n\%\ 5)/2 + 1$,第二项是$(n\ \%\ 5 +5)/2+1$。然后求等差数列和即可。
ll get_sum(ll st,ll times){
return (st+st + 5*(times-1))*times/2;
}
void solve(ll n){
if(n==0) return cout<<"1"<<endl,void();
ll t= n/5+1;
ll ans =0;
ans += get_sum((n%5)/2+1,(t+1)/2);
ans += get_sum(((n%5)+5)/2+1,t/2);
cout<<ans<<endl;
}