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&
韓信點兵 相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b,c ,表示每種隊形排
#include <stdio.h>int main() {int n,a,b,c,i=1,j;scanf("%d %d %d",&a,&b,&c);for(n=10;n<101;n++){if((n%3==a)&&(