【习题】N钱买N鸡 O(n)

N钱买N鸡

Question:LuoGu U124192 N钱买N鸡

Question Link:luogu.com.cn/problem/U124192

Question Algorithm:MathKnowledge

Question Difficulty Level:★★☆☆☆

Question Time Complexity:O(n)

Question Description:

题目描述

一只公鸡值555元,一只母鸡值333元,而111元可买333只小鸡。
现有nnn元钱,想买nnn只鸡。问有多少种买法?

所有钱要用完,某种鸡可以不买。

输入格式

输入一个数nnn

输出格式

可行的买法数。

实例输入
100
实例输出
4
数据规模

对于 20%20\%20%的数据:(1≤n≤1031 ≤ n ≤ 10^31n103

对于 50%50\%50%的数据:(1≤n≤1061 ≤ n ≤ 10^61n106

对于 100%100\%100%的数据:(1≤n≤1091 ≤ n ≤ 10^91n109

Question Analysis:

通过数据规模可知,我们至少应该采用O(n)O(n)O(n)以下时间复杂度的算法。
首先,我们令i为公鸡的数目j为母鸡的数目k为小鸡的数目i为公鸡的数目 \quad j为母鸡的数目 \quad k为小鸡的数目ijk
我们枚举小鸡的数目,这样防止发生小鸡的数目不为可被三整除的情况
现在,我们有444个变量i,j,k,ni , j , k , ni,j,k,n
据题意,可以得到两个方程i+j+k=ni+j+k=ni+j+k=n5×i+3×j+k÷3×1=n5×i+3×j+k÷3×1=n 5×i+3×j+k÷3×1=n
据上述两方程可解
i=4k3−ni=\frac{4k}{3}-ni=34kn
j=2n−7k3j=2n- \frac{7k}{3}j=2n37k

Code:

C++:

#include<iostream>
using namespace std;
int n,res=0;
int main()
{
    cin >> n;
    int i,j,k;//i:公鸡的数目	j:母鸡的数目	k:小鸡的数目
    //枚举小鸡的数目
    for(k=0;k<=n;k=k+3)
    {
    	i=(4*k)/3-n;
    	j=2*n-(7*k)/3;
    	if(5*i+3*j+k/3==n&&i>=0&&j>=0) //注意,i,j可能为负,所以需要特判
    		res++;
	}
    cout << res << endl;
}

Python(3.x):

res=0
n=int(input())
k=0
while(k<=n):
    i=(4*k)//3-n
    j=2*n-(7*k)//3
    if 5*i+3*j+k//3==n and i>=0 and j>=0:
        res=res+1
    k=k+3
print(res)

有时候最简单的方法没准是最好的方法

欢迎大家留下其他算法的代码


如有疑问欢迎在评论区留言或者通过Email联系我

My Email:Wizzy-Ang@qq.com

欢迎大家关注我的个人公众号WizzyAngShare,(还有个人博客)

我会在这里分享编程语言语法,算法,及区块链的相关知识,还有各种奇奇怪怪的小知识等着你~

QRCode
虽然现在这个公众号有亿点草率 ,我会努力更新的~~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值