原題: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 ...