snoi多校模擬賽 1 16 t2

2021-08-14 16:56:45 字數 1857 閱讀 4641

原題:bzoj2900

time limit: 10 sec  memory limit: 512 mb

submit: 99  solved: 59 [

submit][

status][

discuss]

tk在虐題的同時,也喜歡玩遊戲。

現在,有這樣的乙個遊戲,規則是這樣的:

先隨機給出乙個數字n,然後你在操場上把1到n的所有數字寫成一排,就像這樣:

123456789101112131415….

接著你在每個數字前面添上加減號,每逢排在奇數字上的數字,就寫上加號;每逢排在偶數字上的數字,就寫上減號。恩…最後你得到乙個超級長的式子。並且可以算出這個式子的結果。

tk覺得這個遊戲很有意思,於是他沒日沒夜地玩啊玩啊玩啊…

或許你覺得這個遊戲沒有意思…恩…但是,如果你是tk,對於給定的n,你能夠算出來最後的結果應該是多少麼?

多組資料。每個測試點的資料組數不超過1000組。

每一行僅乙個正整數n。保證沒有多餘的什麼奇怪的字元。

每個測試點的資料最後一行一定是數字0。代表這個測試點的結束。

對於每組資料,輸出相應的結果。 12

05【樣例說明】

對於12這個數字:

寫成一行就是:123456789101112

那麼,形成的表示式就是:+1-2+3-4+5-6+7-8+9-1+0-1+1-1+2=5.

【資料範圍】

對於10%的資料:保證第一行是數字100,第二行是0.

對於20%的資料:保證資料組數不超過10,n不超過10^5

對於50%的資料:保證資料組數不超過20,n不超過10^10

對於100%的資料:保證資料組數不超過100,n不超過10^15

[ submit][

status][

discuss]

題解:先打表找規律,然後你就會發現對於1-9,10-99,100-999,1000-9999的答案如下:5,-45,450,-450;

所以這題就可以把數字分開算了

先算這個數字最多能用規律支援的位

之後分奇偶計算剩下的字尾

f[i][j]表示數字為j99999.......(i個9)時的答案所以方程如下

if(!j) _[i][j]=_[i-1][9];

else if(i&1) _[i][j]=_[i][j-1]+_[i-1][9]+_10[i-1]*j;

else _[i][j]=_[i][j-1]+_[i-1][9]-_10[i-1]*j;

之後就能輕易的根據奇偶性算前面可以算的位數了(愉快)

但是你會發現最後的賊tm難算

基本思想就是根據數字排列的奇偶性

奇數除最後一位全部抵消

偶數則會一直累加

然後如果最後剩下的是偶數字數字就要繼續拆分,類似於迭代

是奇數字的話按位暴力即可

**:

#define ll long long

#include #include using namespace std;

ll wei,n,ans,_[20][10],num[20],_10[20]=,_45[20]=;

int main()

for(int i=1;i<=17;i++)

if(i&1) ans+=_45[i];

else ans+=_[i][9]-_[i][0];

} if(wei&1)

ans-=_[wei+1][0];

for(int i=wei+1;i>=1;i--)

}else

}} printf("%lld\n",ans);

}

snoi多校模擬賽 1 18 t2 clique

b最大團 clique.pas c cpp tl 3s ml 512mb description 給定二維座標上的n個點,如果兩個點之間的距離大於k,則他們不能同時被選取。求最大團的大小。也即,選出最多點,使得這些點兩兩之間的距離不大於k。input 多組測試,第一行乙個整數t,表示資料的組數。之後...

NOIP模擬 11 6 T2 序列操作

題目描述 一開始有 n 個非負整數 h i 1 i n 接下來會進行 m 次操作,第 i 次操作給出乙個數 c i 要求你選出 c i 個大於0的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有 c i 個大於0的數 輸入格式 第一行兩個數表示 n 和 m。第二行 n 個數描述 h i ...

SNOI省選模擬賽 dat1t3 tree

題意 給定一棵n個點 n 1條邊的樹,樹上的第i條邊有權值w i q次詢問,每次詢問為下列兩種操作之一 1 增加乙個點對 x,y。2 查詢第x條邊權值為y時所有點對之間的距離的最大值。題解 還沒完全想清楚,先占個坑,最近來補。下附暫時沒有想清的ac的 include include include ...