1. 程式人生 > >SWJTU2017-6月月賽 C-H1Z1[數論][乘法逆元]

SWJTU2017-6月月賽 C-H1Z1[數論][乘法逆元]

題意 化簡 pow mit n) secure col als www

傳送門:http://www.swjtuoj.cn/problem/2393/

技術分享

題意:計算nm的每個點到n*m每個位置的曼哈頓距離和

題解:考慮先計算每個點到x方向的距離和。設當前點為(X,Y),因為每一行在x方向距離和相同,所以只需算一行的距離然後乘n行。一行x方向距離和公式為兩個等差數列的和$\frac{{(m - x) + (m - x + 1) + (x - 1)x}}{2}$

由於要計算每個點的距離和,和之前的方法一樣,計算一行的然後乘n行。${\text{dis = }}\frac{{{n^2}}}{2}\sum\limits_{x = 1}^m {(m - x) + (m - x + 1) + (x - 1)x} $

相加的兩項求和最後都為1*0+2*1+...+m*(m-1) 求n平方和公式為$\frac{{n(n + 1)(2n + 1)}}{6}$ 再減一個等差即可 化簡後為$\frac{{m({m^2} - 1)}}{3}$

最後x軸距離和為 $\frac{{{n^2}m({m^2} - 1)}}{3}$ y軸只需要把mn對換

答案為$\frac{{{n^2}m({m^2} - 1)}}{3} + \frac{{{m^2}n({n^2} - 1)}}{3}$

除以3劃為乘3關於mod的逆元pow(3,mod-2)

代碼如下:

 1 #define _CRT_SECURE_NO_DEPRECATE
 2
#pragma comment(linker, "/STACK:102400000,102400000") 3 #include<iostream> 4 #include<cstdio> 5 #include<fstream> 6 #include<iomanip> 7 #include<algorithm> 8 #include<cmath> 9 #include<deque> 10 #include<vector> 11 #include<assert.h> 12 #include<bitset> 13
#include<queue> 14 #include<string> 15 #include<cstring> 16 #include<map> 17 #include<stack> 18 #include<set> 19 #include<functional> 20 #define pii pair<int, int> 21 #define mod 1000000007 22 #define mp make_pair 23 #define pi acos(-1) 24 #define eps 0.00000001 25 #define mst(a,i) memset(a,i,sizeof(a)) 26 #define all(n) n.begin(),n.end() 27 #define lson(x) ((x<<1)) 28 #define rson(x) ((x<<1)|1) 29 #define inf 0x3f3f3f3f 30 typedef long long ll; 31 typedef unsigned long long ull; 32 using namespace std; 33 ll poww(ll m, int n) 34 { 35 ll ans = 1; 36 ll temp = m%mod; 37 while (n) 38 { 39 if (n & 1) 40 ans *= temp; 41 ans %= mod; 42 temp *= temp; 43 temp %= mod; 44 n >>= 1; 45 } 46 return ans%mod; 47 } 48 int main() 49 { 50 ios::sync_with_stdio(false); 51 cin.tie(0); cout.tie(0); 52 int i, j, k; 53 ll n, m, T; 54 cin >> T; 55 while(T--) 56 { 57 cin >> n >> m; 58 ll ta = (n*n) % mod, tb = (m*m) % mod; 59 ll tc = (ta*m) % mod, td = (tb*n) % mod; 60 ll ans = (tc *(tb - 1)) % mod + (td*(ta - 1)) % mod; 61 ans = (ans*poww(3, mod - 2)) % mod; 62 cout << ans << endl; 63 } 64 return 0; 65 }

SWJTU2017-6月月賽 C-H1Z1[數論][乘法逆元]