链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
游游拿到了一个正整数n,她准备将n拆分成两个正整数a和b,满足a+b=n且a∗b是3的倍数。你能告诉游游有多少种拆分方式吗?
输入描述:
一个正整数n。 1≤n≤
输出描述:
合法的拆分方案数。
分析:如果将整数n从1开始依次拆分,再每轮进行乘积,我们可以看到n的数据范围是,这样显然会非常复杂,很有可能超时。这样大的范围必然有他的规律。满足两数之积是3的倍数,显然我们可以发现只要有一个数是3的倍数就可以,那么就使得a是3的倍数,问题就转变为:
将n拆分为:3的倍数+b;所以需要找n以内有多少个3的倍数。因为a,b不同便可交换,所以找到3的倍数后需要看另一个加数是否是3的倍数来判断个数是否需要*2。这时会发现,若n不是3的倍数,a和b中只会有一个是3的倍数,此时直接将个数*2便是答案。若n是3的倍数,a和b均为3的倍数,答案为n/3-1(排除掉n本身)
代码实现:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin>>n;
if(n<=3)
{
cout<<"0";
return 0;
}
long long f=n/3;
int t=n%3;
if(t)cout<<f*2;
else
cout<<f-1;
}