QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#349411#8340. 3 Sumucup-team1055#TL 134ms6096kbC++202.9kb2024-03-10 01:46:162024-03-10 01:46:18

Judging History

你现在查看的是最新测评结果

  • [2024-09-20 10:20:30]
  • hack成功,自动添加数据
  • (/hack/848)
  • [2024-03-18 21:48:05]
  • hack成功,自动添加数据
  • (/hack/579)
  • [2024-03-18 21:45:33]
  • hack成功,自动添加数据
  • (/hack/578)
  • [2024-03-10 01:46:18]
  • 评测
  • 测评结果:TL
  • 用时:134ms
  • 内存:6096kb
  • [2024-03-10 01:46:16]
  • 提交

answer

#pragma once

#include <bits/stdc++.h>

#define rep(i, s, n) for (int i = (int)(s); i < (int)(n); i++)
#define rrep(i, s, n) for (int i = (int)(n)-1; i >= (int)(s); i--)
#define all(v) v.begin(), v.end()

using ll = long long;
using ld = long double;
using ull = unsigned long long;

template <typename T> bool chmin(T &a, const T &b) {
    if (a <= b) return false;
    a = b;
    return true;
}
template <typename T> bool chmax(T &a, const T &b) {
    if (a >= b) return false;
    a = b;
    return true;
}

using namespace std;

// isprime
bool isprime(ll n){
	if (n == 1) return false;
	for (ll i = 2; i * i <= n; i++){
		if (n % i == 0) return false;
	}
	return true;
}

ll mod_pow(ll x, ll m, int P){
	ll ret = 1;
	ll tmp = x;
	while (m > 0){
		if (m&1){
			ret = ret * tmp % P;
		}
		m >>= 1;
		tmp = tmp * tmp % P;
	}
	return ret;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	int n, k; cin >> n >> k;
	vector<string> s(n);
	rep(i,0,n){
		cin >> s[i];	
	}

	auto naosu = [&](string t) -> vector<int> {
		int pr = (int)t.size();
		int pl = (int)t.size() - k;
		vector<int> ret(k, 0);
		while(pr > 0){
			vector<int> tmp(k, 0);
			rep(i,max(0,pl),pr){
				tmp[i-pl] = t[i] - '0';
			}
			int over = 0;
			int gogo = 0;
			rrep(i,0,k){
				gogo = ret[i] + tmp[i] + over;
				if (gogo >= 10){
					gogo -= 10;
					over = 1;
				}else{
					over = 0;
				}
				ret[i] = gogo;
			}
			if (over == 1){
				rrep(i,0,k){
					gogo = ret[i] + over;
					if (gogo >= 10){
						gogo -= 10;
						over = 1;
					}else{
						over = 0;
					}
					ret[i] = gogo;
				}
			}
			pr -= k;
			pl -= k;
		}
		return ret;
	};

	vector<vector<int>> gar;
	rep(i,0,n){
		gar.push_back(naosu(s[i]));
		/*
		rep(j,0,k){
			cout << gar[i][j];
		}
		cout << endl;
		*/
	}

	random_device seed_gen;
	mt19937 engine(seed_gen());
	uniform_int_distribution<int> dist((int)5e8, (int)1e9);

	const int numpy = 9;
	vector<int> pls(numpy);
	rep(i,0,numpy){
		do {
			pls[i] = dist(engine);
		}while(!isprime(pls[i]));
	}

	vector<vector<ll>> hashl(n, vector<ll>(numpy));
	rep(i,0,n){
		rep(p,0,numpy){
			ll tmp = 0;
			rep(j,0,k){
				tmp = tmp * 10 + gar[i][j];
				tmp %= pls[p];
			}
			hashl[i][p] = tmp;
		}
	}

	vector miru(4, vector<ll>(numpy));
	rep(i,0,numpy){		
		miru[1][i] = (mod_pow(10, k, pls[i]) + 2 * pls[i] - 1) % pls[i];
		miru[2][i] = miru[1][i] * 2 % pls[i];
		miru[3][i] = miru[1][i] * 3 % pls[i];
	}

	ll cnt = 0;
	rep(j,0,n){
		map<vector<int>,int> mp;
		rep(i,0,j+1){
			vector<int> arg(numpy);
			rep(p,0,numpy){
				ll t = hashl[i][p] + hashl[j][p];
				t %= pls[p];
				arg[p] = t;
			}
			mp[arg]++;
		}
		rep(k,j,n){
			rep(d,0,4){
				vector<int> arg(numpy);
				rep(p,0,numpy){
					ll t = hashl[k][p];
					arg[p] = miru[d][p] - t;
				}
				cnt += mp[arg];
			}
		}
	}
	
	cout << cnt << '\n';
	
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3832kb

input:

4 1
0
1
10
17

output:

3

result:

ok 1 number(s): "3"

Test #2:

score: 0
Accepted
time: 134ms
memory: 6096kb

input:

500 859
7118711592236878297922359501613604144948355616986970837340677671376753603836852811886591300370143151943368529129749813118476151865844255212534355441611481420938483178075143062691345257288242460282715389758789648541099090735875617822348551942134616963557723055980260082230902505269975518146286...

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: -100
Time Limit Exceeded

input:

500 17336
11871159223687829792235950161360414494835561698697083734067767137675360383685281188659130037014315194336852912974981311847615186584425521253435544161148142093848317807514306269134525728824246028271538975878964854109909073587561782234855194213461696355772305598026008223090250526997551814628...

output:

0

result: