题目:给定一个正整数,范围是,对于方程,其中,,为非负整数,求有多
少个这样的三元组满足此等式。
分析:本题最暴力的做法就是直接嵌套循环枚举,这样时间复杂度很大,不可取。仔细想想,先看,
这个等式的非负整数解数目为
然后再看方程,设
那么方程解的总数目为
所以枚举就行了。
代码:
#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;
}