题型整理(3)
余数之和
给出正整数 n 和 k,计算 j(n,k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n 的值。
例如j(5,3) = 3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5 = 0 + 1 + 0 + 3 + 3 = 7。
输入格式
输入仅一行,包含两个整数 n,,k。
输出格式
输出仅一行,即 j(n,k)。
数据范围
1≤n,k≤10^9
输入样例
5 3
输出样例
7
思路:
整除分块:
(它喵的,不知道别人网站里的公式可以复制,自己学了半天mathjax语法)
$\lfloor x \rfloor$表示对x向下取整,通过打表可以发现n/i会有多个相等的区间,区间的右端点即为n/(n/i),则整除分块的代码为:
1 | for(int l=1,r;l<=n;l=r+1){ |
而本题的答案为
只要通过等差数列求和公式就能推出每个区间要减去(k/l)(r-l+1)(l+r)/2
1 |
|
Matrix
Fill an n×n matrix with numbers in [1,n2], where each number occurs exactly once.
For a fixed number filling method, let ai be the mininum number in the iith row, and S={a1,a2,…,an}∩{1,2,…,n}.
You need to calculate ∑|S|(mod998244353), i.e. the sum of the size of S over all possible methods.
Input
This problem contains multiple test cases.
The first line contains a single integer T (1≤T≤30).
Then T cases follow, each of which contains a single interger n (1≤n≤5000).
Output
For each test case, output one line contains the value of ∑|S|(mod998244353)
input
1 | 1 |
output
1 | 40 |
思路:
考虑每一个数的贡献,比如1可以作为贡献的方案数就是n C(n n-1,n-1)
其中组合数部分表示1作为该行的最小值出现,选择剩下的数的方案数;n表示该行可以出现在1-n里任意一行。
最后还要乘n ! ∗ ( n * n − n ) !,前者表示1所在行的所有数都可以全排列一遍,后者表示剩下的数可以全排列,然后累加出1 − n的贡献
1 |
|