题目:给定一个正整数

,范围是

,对于方程

,其中

,

,

为非负整数,求有多 少个这样的三元组

满足此等式。
分析:本题最暴力的做法就是直接嵌套循环枚举,这样时间复杂度很大,不可取。仔细想想,先看

,
这个等式的非负整数解数目为

然后再看方程

,设

那么方程解的总数目为

所以枚举就行了。
代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
LL work(LL n)
{
LL ans = 0;
for(int k = 0; k <= n / 3; k++)
ans += (n - 3 * k) / 2 + 1;
return ans;
}
int main()
{
LL n;
while(cin>>n)
cout<<work(n)<<endl;
return 0;
}实际上,对于上面得到的结果可以继续进行优化的。要分类讨论
1. 当 
针对每一个

,如果

为奇数,那么

是偶数,所以

本身就是整数,不用管。而如果

是偶 数,那么

就是奇数了,这样就有

(1)如果

为奇数,此时得到最终答案是

(2)如果

为偶数,那么最终答案是

2. 当 
针对每一个

,如果

为奇数,那么

为奇数,而

如果

为偶数,那么

为偶数,所以

就是它本身。
(1)如果

为奇数,那么最终答案是

(2)如果

为偶数,最终答案是

代码:
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
typedef long long LL;
LL work(LL n)
{
LL k = n / 3;
LL t = (k + 1) * n - 3 * k * (k + 1) / 2;
LL ans = k + 1;
if(k & 1) t -= (k + 1) / 2;
else if(n & 1) t -= (k / 2 + 1);
else t -= k / 2;
t >>= 1;
return ans + t;
}
int main()
{
LL n;
while(cin>>n)
cout << work(n) << endl;
return 0;
}










