x博士正在研究一種生物晶元,其邏輯密集度、容量都遠遠高於普通的半導體晶元。
博士在晶元中設計了 n 個微型光源,每個光源操作一次就會改變其狀態,即:點亮轉為關閉,或關閉轉為點亮。
這些光源的編號從 1 到 n,開始的時候所有光源都是關閉的。
博士計畫在晶元上執行如下動作:
所有編號為2的倍數的光源操作一次,也就是把 246
8... 等序號光源開啟
所有編號為3的倍數的光源操作一次, 也就是對 369
... 等序號光源操作,注意此時6號光源又關閉了。
所有編號為4的倍數的光源操作一次。
.....
直到編號為 n 的倍數的光源操作一次。
x博士想知道:經過這些操作後,某個區間中的哪些光源是點亮的。
【輸入格式】
3個用空格分開的整數:n l r (l10^15) n表示光源數,l表示區間的左邊界,r表示區間的右邊界。
【輸出格式】
輸出1個整數,表示經過所有操作後,[l,r] 區間中有多少個光源是點亮的。
例如:輸入:52
3程式應該輸出:
2再例如:
輸入:1036
程式應該輸出:
3資源約定:
峰值記憶體消耗 < 256m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別。
這道題一看,10^15的資料,很大,很嚇人。
仔細分析:
只要晶元操作的次數是奇數,就會開啟。是偶數,就會關閉。
我們求的是開啟的,就是說我們求操作的次數是偶數的晶元數。
什麼樣的晶元操作次數是偶數?
就是因數+1,為什麼+1,因為最後那個n也要算一次,而我們求因數是從2開始的。
我們可以得出:
void solve()
if(j*j==i)--tol;
}++tol;
if(tol&1)ans++;
}cout
《這樣的解法,可以水過40%的資料,然後,大資料怎麼辦?
10^15啊?怎麼辦?
我們分析,其實因子數都是成對出現的,比如12=2*3*4*6
其實12就是偶數次,所以,其實這些因子數我們都不用算。
因為對晶元操作偶數次還是原樣的。
那什麼數是奇數次呢?
對了!
就是完全平方數!
10^15以內的完全平方數有多少個?
我不知道。。
但是我知道4000萬的平方是10^16,比我們的資料規模還要大!
這個時候,我們就可以在1s之內求解了!
注意,我們求的在n和m以內的完全平方數是ans個,我們的答案是(m-n+1-ans)個。
因為:
直到編號為 n 的倍數的光源操作一次。
題目這句話.。
好了,附**:
#include
#include
using
namespace
std;
#include
typedef
long
long ll;
int main()
}cout
<<(ans-t)0;}
2014藍橋杯本科B組 螞蟻感冒
問題描述 長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺 秒。當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。請你計算,當所有螞蟻都爬離桿子時,有多少只...
17年藍橋杯本科B組決賽 對局匹配
小明發現 的自動對局系統在匹配對手時,只會將積分差恰好是k 的兩名使用者匹配在一起。如果兩人分差小於或大於 k,系統都不會將他們匹配。現在小明知道這個 總共有n 名使用者,以及他們的積分分別是 a1,a2,an 任意兩名使用者積分差不等於 k 輸入第一行包含兩個個整數n和k 第二行包含n 個整數a1...
藍橋杯 B組 決賽 感悟
其實並不是太想寫這個感悟,雖說沒什麼臉面,但還是有必要寫的,畢竟菜鳥還是得多反思呀。在藍橋盃國賽前一天晚上,自己的 qq 號被盜了,然後 訊息,我手速太慢,好叭,是它發的速度太快了,好多都沒撤回,當時弄得心態很崩.看來遇啥啥不順。在賽場上,其實個人認為做的比較小心,畢竟當時不能判呀,但是還是嗚嗚嗚 ...