數學題,無背景。
求$\sum\limits_^ \sum\limits_^ (n \bmod i) \times (m \bmod j), i \neq j \;\bmod\;19940417$ 的值
輸入格式:
兩個整數n m
輸出格式:
答案 mod 19940417
輸入樣例#1:
3 4
輸出樣例#1:
1
輸入樣例#2:
123456 654321
輸出樣例#2:
116430
30%: n,m <= 1000
60%: n,m <= 10^6
100% n,m <= 10^9
solution:
本題實在是太賊有意思了。。。
開始沒有發現條件$i\neq j$,結果一直以為取模錯誤,搞了半天。
首先,我們先忽略$i\neq j$的條件,直接求$\sum\limits_^ \sum\limits_^ (n \bmod i) \times (m \bmod j)$。
對原式化簡:原式$=\sum\limits_^\rfloor)\sum\limits_^\rfloor)}}=(n^2-\sum\limits_^\rfloor))(m^2-\sum\limits_^\rfloor)})}$,然後對這個式子兩邊各自一遍數列分塊套上等差數列求和,求出$ans$值並取模。
由於多算了$i==j$的情況,所以我們還要從$ans$中減去$i==j$的情況。
對於$i==j$的情況累加的值$tot$,容易得出$tot=\sum\limits_^\rfloor)\times(m-j\times\lfloor\rfloor)}=\sum\limits_^\rfloor-n\times i\times \lfloor\rfloor-m\times i\times\lfloor\rfloor}$
然後對於$n\times m$直接累加,對於$n\times i\times \lfloor\rfloor\;,\;m\times i\times\lfloor\rfloor$還是數論分塊套上等差數列求和。
難的是求$i^2\times\lfloor\rfloor$,此時應用乙個數學公式:$1^2+2^2+…+x^2=\frac$,設$c=min(n/(n/i),m/(m/i))$,那麼$i^2+^2+…+c^2=\frac-\frac$,這樣原式就能直接公式求了,但是因為存在取模的條件,所以此時騷操作是處理出$6$的因子並約掉,或者直接預先算出$6$關於模數的逆元$inv$。
最後輸出$ans$就好了。
**:
#include#define il inline#define ll long long
#define for(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define bor(i,a,b) for(int (i)=(b);(i)>=(a);(i)--)
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)>(b)?(b):(a))
using
namespace
std;
const
int mod = 19940417 , inv = 3323403
;ll n,m;
il ll solve(ll x)
return
ans;
}il ll
get(ll x)
intmain()
cout
return0;
}
P6670 清華集訓2016 汽水
p6670 清華集訓2016 汽水 給一棵樹,邊有邊權,要求找到一條路徑使得其平均值和 k 最接近。首先樹上路徑容易想到點分治。然後發現這可以套乙個 0 1 分數規劃,於是我們可以把所有的邊權減掉 k 再二分 mid 現在的問題就是判斷了。我們發現答案具有單調性,於是我們可以排序過後雙指標維護路徑。...
清華集訓 2014 玄學
update text update 我之前講的是個什麼鬼 如果想看看人話版本 戳這。感覺自己被坑騙了。題目明明寫了所有資料不超過int,敢情是輸入資料不超int?迷惑行為 題目感覺有點繞,我盡量 不口胡。首先我們搞一顆線段樹1,樹表示插入序列的編號。如,在q行中第i個出現插入操作 其實拿到這道題我...
清華集訓2016 汽水
試題描述 牛牛來到了乙個盛產汽水的國度旅行。這個國度的地圖上有n個城市,這些城市之間用 n 1 條道路連線,任意兩個城市之間,都存在一條路徑連線。這些城市生產的汽水有許多不同的風味,在經過道路 i 時,牛牛會喝掉 wi 的汽水。牛牛非常喜歡喝汽水,但過量地用汽水是有害健康的,因此,他希望在他旅行的這...