JZOJ 4 8 2434 開關燈泡 高精度

2021-07-30 06:27:54 字數 2049 閱讀 5296

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個禮品盒中選出兩個拿走。小朋友們商量了一會兒後決定,他們...