題目大意:給你由n個人按順時針圍成的乙個圓圈。現在1號有乙個球。他可以選擇乙個正整數k(k<=n)將球傳給1+k。後面的人也必須把球傳給1+k+k。一直到回到1號(一定可以回到1號)。所有經過的人編號的和為乙個有趣價值。給你乙個n,讓你從小到大輸出他所以可能的有趣價值。
對於樣例一:
思路:開始沒有思路,把n=1, 2, 3, 4, 5 ,6都寫出來準備找規律。按照序列來找規律。可是沒有找到。。。
然後仔細看了看圖,發現:
➀k不為n的因數時。球會在每個人的手中傳一次。所以有趣價值為1+2+…+n = n(1+n)/2。
➁k為n的因數時。每次將形成乙個新的有趣價值,因為球只傳一圈就回到1的手上.並且k越大有趣價值越小。並且有趣價值為乙個等差數列:a1=1。 d=k,n=n/k。用set儲存因數,可以o(log n)去重+排序。
思考:拿到一道題。應該是按題意找規律,還是打表找規律。思路錯了的話,就容易卡題。
如果題意比較容易簡單。 優先按題意找規律。否則打表找規律。實際上可以同時用兩個方法。
#includeusing namespace std;
sets;
int main()
}set::iterator r=(--s.end());
int n=s.size();
int p=0;
for(set::iterator i=r;p
printf("\n");
return 0;
}
藍橋杯 等差數列(C語言)
解決方案 1.找出5個數中兩數最小之差 假定公差 2.從5個數的最小項開始加公差,加到大於等於5個數的最大項後,看是否遍及5項的每一項。遍及 確定公差 未遍及 擬公差減一 最壞情況公差為1 include stdio.h void out int gc,int a printf d sum intq...
Leetcode 413 等差數列劃分 C
如果乙個數列至少有三個元素,並且任意兩個相鄰元素之差相同,則稱該數列為等差數列。例如,以下數列為等差數列 1,3,5,7,9 7,7,7,7 3,1,5,9以下數列不是等差數列。1,1,2,5,7陣列 a 包含 n 個數,且索引從0開始。陣列 a 的乙個子陣列劃分為陣列 p,q p 與 q 是整數且...
等差數列異或和的小規律
異或 xor,運算符號 按位計算,同0異1,1 0 1,1 1 0,如此。現定義等差數列1,2,n的異或和為f n 1 2 n,求f n 的值。我們很容易想到質樸的實現如下 int func int n return xor sum 時間複雜度o n 空間複雜度此處沒有太大必要討論。聯想到等差數列的...