參考
可以看出,被按了奇數次數的燈最後是開著的,而被按了偶數次數的燈最後是關著的。
因為是從 2 開始按的, 所以如果乙個數有偶數個因子那就會被按奇數次,如果有奇數個因子就會被按偶數次。
所以轉化為求 [a, b] 內有偶數個因子的數
這就會涉及到質因子分解定理,即任何正數都能被分解成多個質數的冪次乘積的形式
n=(p[1] ^ e[1])(p[2] ^ e[2])……(p[k]^e[k]),其中p[i]是質數,e[i]是p[i]的冪次。而由這個公式我們又可以匯出乙個數有多少個因子的計算公式:factornumber(n)=(e[1]+1)(e[2]+1)……(e[k]+1)。
因為 奇 * 奇 = 奇, 奇 * 偶= 偶, 偶 * 偶 = 偶,顯然判斷奇數 factornumber(n) 比判斷偶數 factornumber(n) 簡單
那麼什麼條件下滿足factornumber(n)是奇數呢?顯然必須所有的e[1],e[2],……,e[k]都必須是偶數,這樣才能保證e[i]+1是奇數,結果乘積才能是奇數。而由於e[1],e[2],……,e[k]都是偶數,那麼n一定是乙個完全平方數(因為sqrt(n)=(p[1] ^ (e[1]/2)) ( p[2] ^ (e[2]/2))……*(p[k]^(e[k]/2))是整數) 。
回到按燈泡的問題上來,最後編號為完全平方數的燈關著的, 非完全平方數的燈是開著的
#include
#include
#include
#include
#include
#include
#include
#include
#define mod 1000000007
using namespace std;
typedef
long
long ll;
const
int n =
106;
const
long
long inf =
0x3f3f3f3f
;const
double eps =
1e-5
;const
double pi =
acos(-
1);int
main()
printf
("%d\n"
, ans)
;return0;
}
關於sdnuoj1060反思
給定 n 1 n 10000000 個正整數 2147483647 找出其中的第k 1 k 10 大數。第一行,兩個整數n,k,第二行n個整數 第k大數 正解 include include include using namespace std int main for int i 0 i n i...
SDNUOJ 1038 收集寶藏
description 有乙個n n的矩陣,矩陣每個格仔中都有一些寶藏,從左上角 1,1 出發,每次只能向下或者向右移動一格,已知每個格仔中寶藏的價值,求走到右下角 n,n 時能收集到的寶藏的總最大價值。input 第一行為乙個整數n 1 n 1000 表示矩陣的行 列數。接下來n行,每行n個整數,...
1283 最小周長
1283 最小周長 codility 基準時間限制 1 秒 空間限制 131072 kb 分值 5 難度 1級演算法題 乙個矩形的面積為s,已知該矩形的邊長都是整數,求所有滿足條件的矩形中,周長的最小值。例如 s 24,那麼有 這4種矩形,其中的周長最小,為20。input 輸入1個數s 1 s 1...