description
乙個房間裡有n盞燈泡,一開始都是熄著的,有1到n個時刻,每個時刻i,我們會將i的倍數的燈泡改變狀態(即原本開著的現將它熄滅,原本熄滅的現將它點亮),問最後有多少盞燈泡是亮著的。
input
乙個數n
output
m,表示最後有m盞是亮著的
sample input
5sample output
2hint
範圍:40%的資料保證,n<=maxlongint
100%的資料保證,n<=10^200
1 ———還剩一盞燈
2 3 4 ————還剩兩盞燈
5 6 7 8 9 ————還剩三盞燈
10 11 12 13 14 15 16 ————還剩四盞燈
…… ……
由這個規律,我們看出其實這題只是將n開方就得出解。那我們怎麼得出解呢?
分析:
其實n最長為200位,所以我們列舉長度,最多列舉到100位,所以我們就可以用列舉被開方後的數。
我們可以舉個例子:
如:124860 為乙個6位數,則被開方的數為3位數
那我們就可以從高位開始列舉9~0,一直列舉到這個數小於n。
(tips:這題要用到高精度乘高精度)
**如下:
var
a,b,c:array[0..300] of longint;
n:longint;
procedure
init;
var i:longint;
s:string;
begin
readln(s);
n:=length(s);
for i:=1
to n do c[300-(n-i)]:=ord(s[i])-48;
end;
procedure
main;
var i,j,k,z:longint;
flag:boolean;
begin
for i:=300-n div2to
300do
begin
for j:=9
downto0do
begin
a[i]:=j;
fillchar(b,sizeof(b),0);
for k:=200
to300
dofor z:=200
to300
do b[k+z-300]:=b[k+z-300]+a[k]*a[z];
for k:=300
downto1do
begin
b[k-1]:=b[k-1]+b[k] div
10; b[k]:=b[k] mod
10; end;
flag:=true;
for k:=0
to300
doif b[k]<>c[k] then
break;
if b[k]>c[k] then flag:=false;
if flag=true
then
break;
end;
end;
end;
procedure
print;
var i,j:longint;
begin
for i:=0
to300
doif a[i]<>0
then
break;
for j:=i to
300do
write(a[j]);
end;
begin
init;
main;
print;
end.
JZOJ 交換 模擬
給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...
JZOJ 規律 遊戲
有一堆金塊,king和貓老大輪流抽金塊,每次抽的個數必然是2的次方冪,求勝利 抽走最後一塊 的是誰 三行每行乙個數 n 0對於每局,如果 king 必勝則輸出一行 king will win.否則第一行輸出 maolaoda willwin.第二行輸出他第一次拿的最小數量。8 42maolaoda ...
JZOJ 禮物 數論
聖誕節這天,某商店準備了n個禮品盒,分別用整數1 n進行編號。其中,編號為1的盒子中有乙個糖果,編號為2的盒子中有2個糖果,編號為n的盒子中有n個糖果。這天一早,中山幼兒園的k個小朋友一起來到這間商店。作為當天的第一批顧客,這些小朋友可以從這n個禮品盒中選出兩個拿走。小朋友們商量了一會兒後決定,他們...