1. 程式人生 > >x+2y+3z=n的非負整數解數

x+2y+3z=n的非負整數解數

題目:給定一個正整數,範圍是,對於方程,其中為非負整數,求有多

     少個這樣的三元組滿足此等式。

分析:本題最暴力的做法就是直接巢狀迴圈列舉,這樣時間複雜度很大,不可取。仔細想想,先看

     這個等式的非負整數解數目為

                           

     然後再看方程,設

                           

     那麼方程解的總數目為

    

     所以列舉就行了。

程式碼:

#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;
}

相關推薦

x+2y+3z=n整數解數

題目:給定一個正整數,範圍是,對於方程,其中,,為非負整數,求有多      少個這樣的三元組滿足此等式。 分析:本題最暴力的做法就是直接巢狀迴圈列舉,這樣時間複雜度很大,不可取。仔細想想,先看,

代碼題(2)— 統計所有小於整數 n 的質數的數量

code 整數 color () res size result bool rime   質數也叫素數,只能被1和它本身整除的。   利用篩選法。 class Solution { public: int countPrimes(int n) {

寫一個遞迴函式DigitSum(n),輸入一個整數,返回組成它的數字之和, 例如,呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19

#include <stdio.h> #define _CRT_SECURE_NO_WARNINGS 1 int DigitSum(int i) { int sum = 0; int j = 0; if (i != 0) { j = i % 10; i = i /

遞迴函式DigitSum(n),輸入一個整數,返回組成它的數字之和

例:呼叫DigitSum(1729),則應該返回1+7+2+9,它的和是19 程式碼: #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> int Add(

ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意整數區間中1出現的次數(從1 到 n 中1出現的次數)。

/* 思路:(這裡不僅僅侷限於1,其他數字也是相通的) 找規律,當計算右數第  i  位包含的 X 的個數時: 取第  i  位左邊(高位)的數字,乘以  10 i−1 ,得到基礎值  a 。 取第  i  位數字,計算修正值: 如果大於 X,則結果為  a+ 10 i

1.5程式設計基礎之迴圈控制 9. 描述 計算整數 m 到 n(包括m 和 n )之間的所有奇數的和

描述計算非負整數m到n(包括m和n)之間的所有奇數的和,其中,m不大於n,且n不大於300.例如m = 3,n = 12,其和則為:3+ 5 + 7 + 9 + 11 = 35。輸入兩個數m和n,兩個數

寫一個遞迴函式DigitSum(n),輸入一個整數,返回他組成它的數字之和

寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回他組成它的數字之和 思路分析:遞迴函式的遞推關係:sum%10+DigitSum(sum\10); ​ 出口:sum為個位數; 完整程式: #define _CRT_SECURE_NO_WARNINGS #incl

【Python】收集雨水問題:給定n整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量?

收集雨水問題 給定n個非負整數,表示直方圖的方柱的高度,同時,每個方柱的寬度假定都為1。若使用這樣形狀的容器收集雨水,可以盛多少水量? 如輸入:0,1,0,2,1,0,1,3,2,1,2,1;返回6。 題目來源 分析思路:

給定兩個空連結串列來表示兩個整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。

題目描述: 給定兩個非空連結串列來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回一個新的連結串列。 你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。 思路: 1.定義連結串列類 2.建立兩個數的連結串列表示物件 3.傳入函式實現相加:每一位相加,設

將給定整數列表中的數字排列成最大數字的2種方法。例如,給定[50,2,1,9],最大數字為95021。

一、題目簡介 編寫一個能將給定非負整數列表中的數字排列成最大數字的函式。例如,給定[50,2,1,9],最大數字為95021。 此處以如下陣列為例:Integer[] num=new Integer[]{51,9,370,82,4,796}; 二、例項程式碼 1、方法一: /

LeetCode 給定一個整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。

/**  * Return an array of size *returnSize.  * Note: The returned array must be malloced, assume caller calls free().  */ int* countBit

給定一個整數 num,反覆將各個位上的數字相加,直到結果為一位數

示例: 輸入: 38 輸出: 2 解釋: 各位相加的過程為:3 + 8 = 11, 1 + 1 = 2。 由於2是一位數,所以返回 2。 進階: 你可以不使用迴圈或者遞迴,且在 O(1) 時間複雜度內解決這個問題嗎?   class Solution {  

給定一列整數,求這些數連線起來能組成的最大的數

題目是這樣的: 程式碼是這樣的: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scann

計算位數最高達300位的兩個整數的乘積,C語言程式設計實現

-------世界太蕪雜,我幫你整理---- -------C語言大數相乘運算---------- 今天我們要程式設計實現的是兩個超長整型資料進行相乘,並輸出結果 比如: 2134897427972647678 * 3497892374 我們先來看看執行效果

隨筆-給定兩個字串形式的整數 num1 和num2 ,計算它們的和

題目:給定兩個字串形式的非負整數 num1 和num2 ,計算它們的和。 注意: num1 和num2 的長度都小於 5100. num1 和num2 都只包含數字 0-9. num1 和num2 都不包含任何前導零。 你不能使用任何內建 BigInteger 庫, 也不能直接將

[LeetCode] Non-negative Integers without Consecutive Ones 整數不包括連續的1

Given a positive integer n, find the number of non-negative integers less than or equal to n, whose binary representations do NOT contain consecutive one

判斷一個自然數是否為2的整數次方(power of 2)

public class IsPowerof2Demo { public static boolean isPoweroftwo(int x){ if(x<1){ return false; } int and

將一個長度最多為30位數字的十進位制整數轉換為二進位制數輸出

#include "iostream" #include "string" #include "cmath" #include "vector" #include "algorithm" using

【C/C++程式碼練習12】正序分解整數

題目     輸入一個非負整數,正序輸出它的每一位數字。例如輸入12345,則輸出1 2 3 4 5。例如輸入7000,則輸出7 0 0 0。 解法如下 #include <stdio.h&