/* _____ _ _ _ _ |_ _| |__ ___ / \ _ __ ___| |__ _ _| | | | | '_ \ / _ \ / _ \ | '_ \/ __| '_ \| | | | | | | | | | | __// ___ \| | | \__ \ | | | |_| | | |_| |_| |_|\___/_/ \_\_| |_|___/_| |_|\__,_|_| */ #include #include #include #define ll long long #define pb push_back #define ppb pop_back #define endl '\n' #define mii map #define msi map #define mis map #define rep(i,a,b) for(ll i=a;i=a;i--) #define trav(a, x) for(auto& a : x) #define pii pair #define vi vector #define vii vector> #define vs vector #define all(a) (a).begin(),(a).end() #define F first #define S second #define sz(x) (ll)x.size() #define hell 1000000007 #define lbnd lower_bound #define ubnd upper_bound #define max(a,b) (a>b?a:b) #define min(a,b) (a>>I'm Here<<<\n"<, rb_tree_tag,tree_order_statistics_node_update> #define TIME cerr << "\nTime elapsed: " << setprecision(5) <<1000.0 * clock() / CLOCKS_PER_SEC << "ms\n"; #define DECIMAL(n) cout << fixed ; cout << setprecision(n); #define FAST ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace __gnu_pbds; using namespace std; #define PI 3.141592653589793 #define N 1005 ll dp[N][N]; ll n,m,r; ll fact[2*N],modi[2*N]; ll add(ll a,ll b,ll mod=hell) { return (a+b)%mod; } ll sub(ll a,ll b,ll mod=hell) { return (a-b+mod)%mod; } ll mul(ll a,ll b,ll mod=hell) { return (a*b)%mod; } ll nCr(ll n,ll r) { if(n>= 1; } return ans%mod; } ll fun(pii p1,pii p2) { if((p1.F - r > p2.F + r) || (p1.F + r < p2.F - r) || (p1.S - r > p2.S + r) || (p1.S + r < p2.S - r)) return 0; // what_is(p1.F); // what_is(p1.S); // what_is(p2.F); // what_is(p2.S); ll x1 = min(max(p1.F+r,p2.F-r), max(p1.F-r,p2.F+r)); ll x2 = max(min(p1.F+r,p2.F-r), min(p1.F-r,p2.F+r)); ll y1 = min(max(p1.S+r,p2.S-r), max(p1.S-r,p2.S+r)); ll y2 = max(min(p1.S+r,p2.S-r), min(p1.S-r,p2.S+r)); // what_is(x1); // what_is(x2); // what_is(y1); // what_iss(y2); x2 = max(x2 - 1, 0); y2 = max(y2 - 1, 0); return (dp[x1][y1] + dp[x2][y2] - dp[x1][y2] - dp[x2][y1]); } void solve() { cin >> n >> m >> r; vector> v(n); ll nCm = nCr(n,m); rep(i,0,n) { cin >> v[i].F.F >> v[i].F.S >> v[i].S; dp[v[i].F.F][v[i].F.S] = 1; } rep(i,0,N) { rep(j,1,N) { dp[i][j] += dp[i][j-1]; } } rep(j,0,N) { rep(i,1,N) { dp[i][j] += dp[i-1][j]; } } ll ans = 0; ll k; rep(i, 0, n) { rep(j, 0, n) { k = fun(v[i].F,v[j].F); // what_is(i); // what_is(j); // what_iss(k); ans = add(ans, mul(sub(nCm, nCr(n - k, m)), mul(v[i].S, v[j].S))); } } cout << ans << endl; return; } int main() { fact[0] = 1; rep(i,1,2*N) { fact[i] = (fact[i-1] * i) % hell; } rep(i,0,2*N) { modi[i] = expo(fact[i], hell - 2, hell); } FAST int TESTS=1; // cin>>TESTS; rep(i,0,TESTS) { // cout<<"Case #"<