QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#281298 | #7789. Outro: True Love Waits | ucup-team1134# | RE | 159ms | 39172kb | C++23 | 18.6kb | 2023-12-10 02:13:42 | 2023-12-10 02:13:42 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=4000005,INF=1<<30;
//modintのみ
// from: https://gist.github.com/yosupo06/ddd51afb727600fd95d9d8ad6c3c80c9
// (based on AtCoder STL)
#include <cassert>
#include <numeric>
#include <type_traits>
namespace atcoder {
namespace internal {
#ifndef _MSC_VER
template <class T>
using is_signed_int128 =
typename std::conditional<std::is_same<T, __int128_t>::value ||
std::is_same<T, __int128>::value,
std::true_type,
std::false_type>::type;
template <class T>
using is_unsigned_int128 =
typename std::conditional<std::is_same<T, __uint128_t>::value ||
std::is_same<T, unsigned __int128>::value,
std::true_type,
std::false_type>::type;
template <class T>
using make_unsigned_int128 =
typename std::conditional<std::is_same<T, __int128_t>::value,
__uint128_t,
unsigned __int128>;
template <class T>
using is_integral = typename std::conditional<std::is_integral<T>::value ||
is_signed_int128<T>::value ||
is_unsigned_int128<T>::value,
std::true_type,
std::false_type>::type;
template <class T>
using is_signed_int = typename std::conditional<(is_integral<T>::value &&
std::is_signed<T>::value) ||
is_signed_int128<T>::value,
std::true_type,
std::false_type>::type;
template <class T>
using is_unsigned_int =
typename std::conditional<(is_integral<T>::value &&
std::is_unsigned<T>::value) ||
is_unsigned_int128<T>::value,
std::true_type,
std::false_type>::type;
template <class T>
using to_unsigned = typename std::conditional<
is_signed_int128<T>::value,
make_unsigned_int128<T>,
typename std::conditional<std::is_signed<T>::value,
std::make_unsigned<T>,
std::common_type<T>>::type>::type;
#else
template <class T> using is_integral = typename std::is_integral<T>;
template <class T>
using is_signed_int =
typename std::conditional<is_integral<T>::value && std::is_signed<T>::value,
std::true_type,
std::false_type>::type;
template <class T>
using is_unsigned_int =
typename std::conditional<is_integral<T>::value &&
std::is_unsigned<T>::value,
std::true_type,
std::false_type>::type;
template <class T>
using to_unsigned = typename std::conditional<is_signed_int<T>::value,
std::make_unsigned<T>,
std::common_type<T>>::type;
#endif
template <class T>
using is_signed_int_t = std::enable_if_t<is_signed_int<T>::value>;
template <class T>
using is_unsigned_int_t = std::enable_if_t<is_unsigned_int<T>::value>;
template <class T> using to_unsigned_t = typename to_unsigned<T>::type;
} // namespace internal
} // namespace atcoder
#include <utility>
namespace atcoder {
namespace internal {
constexpr long long safe_mod(long long x, long long m) {
x %= m;
if (x < 0) x += m;
return x;
}
struct barrett {
unsigned int _m;
unsigned long long im;
barrett(unsigned int m) : _m(m), im((unsigned long long)(-1) / m + 1) {}
unsigned int umod() const { return _m; }
unsigned int mul(unsigned int a, unsigned int b) const {
unsigned long long z = a;
z *= b;
#ifdef _MSC_VER
unsigned long long x;
_umul128(z, im, &x);
#else
unsigned long long x =
(unsigned long long)(((unsigned __int128)(z)*im) >> 64);
#endif
unsigned int v = (unsigned int)(z - x * _m);
if (_m <= v) v += _m;
return v;
}
};
constexpr long long pow_mod_constexpr(long long x, long long n, int m) {
if (m == 1) return 0;
unsigned int _m = (unsigned int)(m);
unsigned long long r = 1;
unsigned long long y = safe_mod(x, m);
while (n) {
if (n & 1) r = (r * y) % _m;
y = (y * y) % _m;
n >>= 1;
}
return r;
}
constexpr bool is_prime_constexpr(int n) {
if (n <= 1) return false;
if (n == 2 || n == 7 || n == 61) return true;
if (n % 2 == 0) return false;
long long d = n - 1;
while (d % 2 == 0) d /= 2;
for (long long a : {2, 7, 61}) {
long long t = d;
long long y = pow_mod_constexpr(a, t, n);
while (t != n - 1 && y != 1 && y != n - 1) {
y = y * y % n;
t <<= 1;
}
if (y != n - 1 && t % 2 == 0) {
return false;
}
}
return true;
}
template <int n> constexpr bool is_prime = is_prime_constexpr(n);
constexpr std::pair<long long, long long> inv_gcd(long long a, long long b) {
a = safe_mod(a, b);
if (a == 0) return {b, 0};
long long s = b, t = a;
long long m0 = 0, m1 = 1;
while (t) {
long long u = s / t;
s -= t * u;
m0 -= m1 * u; // |m1 * u| <= |m1| * s <= b
auto tmp = s;
s = t;
t = tmp;
tmp = m0;
m0 = m1;
m1 = tmp;
}
if (m0 < 0) m0 += b / s;
return {s, m0};
}
constexpr int primitive_root_constexpr(int m) {
if (m == 2) return 1;
if (m == 167772161) return 3;
if (m == 469762049) return 3;
if (m == 754974721) return 11;
if (m == 998244353) return 3;
int divs[20] = {};
divs[0] = 2;
int cnt = 1;
int x = (m - 1) / 2;
while (x % 2 == 0) x /= 2;
for (int i = 3; (long long)(i)*i <= x; i += 2) {
if (x % i == 0) {
divs[cnt++] = i;
while (x % i == 0) {
x /= i;
}
}
}
if (x > 1) {
divs[cnt++] = x;
}
for (int g = 2;; g++) {
bool ok = true;
for (int i = 0; i < cnt; i++) {
if (pow_mod_constexpr(g, (m - 1) / divs[i], m) == 1) {
ok = false;
break;
}
}
if (ok) return g;
}
}
template <int m> constexpr int primitive_root = primitive_root_constexpr(m);
} // namespace internal
} // namespace atcoder
#include <cassert>
#include <numeric>
#include <type_traits>
#ifdef _MSC_VER
#include <intrin.h>
#endif
namespace atcoder {
namespace internal {
struct modint_base {};
struct static_modint_base : modint_base {};
template <class T> using is_modint = std::is_base_of<modint_base, T>;
template <class T> using is_modint_t = std::enable_if_t<is_modint<T>::value>;
} // namespace internal
template <int m, std::enable_if_t<(1 <= m)>* = nullptr>
struct static_modint : internal::static_modint_base {
using mint = static_modint;
public:
static constexpr int mod() { return m; }
static mint raw(int v) {
mint x;
x._v = v;
return x;
}
static_modint() : _v(0) {}
template <class T, internal::is_signed_int_t<T>* = nullptr>
static_modint(T v) {
long long x = (long long)(v % (long long)(umod()));
if (x < 0) x += umod();
_v = (unsigned int)(x);
}
template <class T, internal::is_unsigned_int_t<T>* = nullptr>
static_modint(T v) {
_v = (unsigned int)(v % umod());
}
static_modint(bool v) { _v = ((unsigned int)(v) % umod()); }
unsigned int val() const { return _v; }
mint& operator++() {
_v++;
if (_v == umod()) _v = 0;
return *this;
}
mint& operator--() {
if (_v == 0) _v = umod();
_v--;
return *this;
}
mint operator++(int) {
mint result = *this;
++*this;
return result;
}
mint operator--(int) {
mint result = *this;
--*this;
return result;
}
mint& operator+=(const mint& rhs) {
_v += rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator-=(const mint& rhs) {
_v -= rhs._v;
if (_v >= umod()) _v += umod();
return *this;
}
mint& operator*=(const mint& rhs) {
unsigned long long z = _v;
z *= rhs._v;
_v = (unsigned int)(z % umod());
return *this;
}
mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {
if (n & 1) r *= x;
x *= x;
n >>= 1;
}
return r;
}
mint inv() const {
if (prime) {
assert(_v);
return pow(umod() - 2);
} else {
auto eg = internal::inv_gcd(_v, m);
assert(eg.first == 1);
return eg.second;
}
}
friend mint operator+(const mint& lhs, const mint& rhs) {
return mint(lhs) += rhs;
}
friend mint operator-(const mint& lhs, const mint& rhs) {
return mint(lhs) -= rhs;
}
friend mint operator*(const mint& lhs, const mint& rhs) {
return mint(lhs) *= rhs;
}
friend mint operator/(const mint& lhs, const mint& rhs) {
return mint(lhs) /= rhs;
}
friend bool operator==(const mint& lhs, const mint& rhs) {
return lhs._v == rhs._v;
}
friend bool operator!=(const mint& lhs, const mint& rhs) {
return lhs._v != rhs._v;
}
private:
unsigned int _v;
static constexpr unsigned int umod() { return m; }
static constexpr bool prime = internal::is_prime<m>;
};
template <int id> struct dynamic_modint : internal::modint_base {
using mint = dynamic_modint;
public:
static int mod() { return (int)(bt.umod()); }
static void set_mod(int m) {
assert(1 <= m);
bt = internal::barrett(m);
}
static mint raw(int v) {
mint x;
x._v = v;
return x;
}
dynamic_modint() : _v(0) {}
template <class T, internal::is_signed_int_t<T>* = nullptr>
dynamic_modint(T v) {
long long x = (long long)(v % (long long)(mod()));
if (x < 0) x += mod();
_v = (unsigned int)(x);
}
template <class T, internal::is_unsigned_int_t<T>* = nullptr>
dynamic_modint(T v) {
_v = (unsigned int)(v % mod());
}
dynamic_modint(bool v) { _v = ((unsigned int)(v) % mod()); }
unsigned int val() const { return _v; }
mint& operator++() {
_v++;
if (_v == umod()) _v = 0;
return *this;
}
mint& operator--() {
if (_v == 0) _v = umod();
_v--;
return *this;
}
mint operator++(int) {
mint result = *this;
++*this;
return result;
}
mint operator--(int) {
mint result = *this;
--*this;
return result;
}
mint& operator+=(const mint& rhs) {
_v += rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator-=(const mint& rhs) {
_v += mod() - rhs._v;
if (_v >= umod()) _v -= umod();
return *this;
}
mint& operator*=(const mint& rhs) {
_v = bt.mul(_v, rhs._v);
return *this;
}
mint& operator/=(const mint& rhs) { return *this = *this * rhs.inv(); }
mint operator+() const { return *this; }
mint operator-() const { return mint() - *this; }
mint pow(long long n) const {
assert(0 <= n);
mint x = *this, r = 1;
while (n) {
if (n & 1) r *= x;
x *= x;
n >>= 1;
}
return r;
}
mint inv() const {
auto eg = internal::inv_gcd(_v, mod());
assert(eg.first == 1);
return eg.second;
}
friend mint operator+(const mint& lhs, const mint& rhs) {
return mint(lhs) += rhs;
}
friend mint operator-(const mint& lhs, const mint& rhs) {
return mint(lhs) -= rhs;
}
friend mint operator*(const mint& lhs, const mint& rhs) {
return mint(lhs) *= rhs;
}
friend mint operator/(const mint& lhs, const mint& rhs) {
return mint(lhs) /= rhs;
}
friend bool operator==(const mint& lhs, const mint& rhs) {
return lhs._v == rhs._v;
}
friend bool operator!=(const mint& lhs, const mint& rhs) {
return lhs._v != rhs._v;
}
private:
unsigned int _v;
static internal::barrett bt;
static unsigned int umod() { return bt.umod(); }
};
template <int id> internal::barrett dynamic_modint<id>::bt = 998244353;
using modint998244353 = static_modint<998244353>;
using modint1000000007 = static_modint<1000000007>;
using modint = dynamic_modint<-1>;
namespace internal {
template <class T>
using is_static_modint = std::is_base_of<internal::static_modint_base, T>;
template <class T>
using is_static_modint_t = std::enable_if_t<is_static_modint<T>::value>;
template <class> struct is_dynamic_modint : public std::false_type {};
template <int id>
struct is_dynamic_modint<dynamic_modint<id>> : public std::true_type {};
template <class T>
using is_dynamic_modint_t = std::enable_if_t<is_dynamic_modint<T>::value>;
} // namespace internal
} // namespace atcoder
using mint=atcoder::modint1000000007;
mint rui[MAX],SC[MAX];
int main(){
std::ifstream in("text.txt");
std::cin.rdbuf(in.rdbuf());
cin.tie(0);
ios::sync_with_stdio(false);
rui[0]=1;
for(int i=1;i<MAX;i++) rui[i]=rui[i-1]*2;
SC[0]=1;
for(int i=1;i<MAX;i++) SC[i]=SC[i-1]*4+1;
int Q;cin>>Q;
while(Q--){
string S,T;
ll K;cin>>S>>T>>K;
if(si(S)<si(T)) swap(S,T);
reverse(all(T));
while(si(T)<si(S)) T+='0';
reverse(all(T));
for(int i=0;i<si(S);i++){
if(T[i]=='1') S[i]^=1;
}
reverse(all(S));
if(si(S)&1) S+='0';
while(si(S)){
if(S[si(S)-2]=='0'&&S[si(S)-1]=='0'){
S.pop_back();
S.pop_back();
}else{
break;
}
}
int can=INF;
for(int i=0;i<si(S);i++){
if(S[i]=='1'){
can=i/2+1;
break;
}
}
if(can<K) cout<<-1<<"\n";
else{
mint ans=0;
for(int i=0;i<si(S);i+=2){
string X;X+=S[i];X+=S[i+1];
if(X=="00"){
}
if(X=="10"){
ans+=SC[i/2];
}
if(X=="01"){
ans+=SC[i/2]*3;
}
if(X=="11"){
ans+=SC[i/2]*2;
}
}
for(ll k=2;k<=K;k++) ans+=rui[2*(k-1)];
cout<<ans.val()<<endl;
}
}
/*
string S="0000000000";
map<string,int> MA;
map<string,vector<int>> dic;
set<pair<string,string>> SE;
for(int q=0;;q++){
MA[S]++;
dic[S].push_back(q);
cout<<S<<" "<<MA[S]<<" "<<q<<endl;
for(int i=9;i>=0;i--){
auto T=S;
T[i]^=1;
if(!SE.count(mp(S,T))){
SE.insert(mp(S,T));
SE.insert(mp(T,S));
S=T;
break;
}
if(i==0){
for(auto [a,b]:dic){
if(si(b)==3){
cout<<a<<" ";
for(int x:b) cout<<x<<" ";
cout<<endl;
}
}
return 0;
}
}
}
*/
}
详细
Test #1:
score: 100
Accepted
time: 24ms
memory: 34768kb
input:
4 1 10 1 1 10 2 100 0 2 11 11 3
output:
2 -1 9 20
result:
ok 4 number(s): "2 -1 9 20"
Test #2:
score: 0
Accepted
time: 26ms
memory: 34748kb
input:
1 0 0 1
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: 0
Accepted
time: 24ms
memory: 34700kb
input:
100 110111 11111 1 10110 101101 1 11010 111111 1 100110 1 1 10010 11010 1 1100 10111 1 100100 111110 1 101110 101100 1 1011 10110 1 110100 1110 1 11010 11000 1 11110 1000 1 111000 11101 1 110 1001 1 101010 11000 1 10 111110 1 110001 101000 1 1010 1000 1 10101 11 1 111011 11010 1 110001 100000 1 1100...
output:
78 59 69 70 15 38 39 3 32 60 3 29 69 12 45 52 37 3 29 64 22 39 54 69 65 27 33 76 34 18 57 13 81 15 23 70 69 36 18 23 29 42 69 54 6 0 63 3 29 15 10 16 80 24 37 59 71 13 23 31 21 34 23 48 21 47 7 44 42 3 37 75 59 29 55 39 29 28 29 70 55 16 54 47 24 18 79 60 8 26 64 58 32 6 8 37 2 68 42 44
result:
ok 100 numbers
Test #4:
score: 0
Accepted
time: 26ms
memory: 34748kb
input:
100 10011111 111 2 1011101100 1000000100 1 100011111 1001001111 1 1001100101 1100100001 1 10101000 10000100 1 1011110101 100011101 1 110100001 111011010 1 1101001100 1111101101 1 1001101 11011010 1 1101110110 1101011000 1 110011001 1100001111 2 1001111001 1011001111 1 1001110 1101110100 2 1110110100...
output:
295 248 788 431 73 930 144 319 283 76 -1 305 -1 -1 86 -1 312 293 1293 433 1179 0 884 963 1215 576 -1 1132 499 811 864 949 1322 406 526 862 -1 447 1203 1238 873 -1 -1 1131 1108 438 134 359 80 740 1057 752 31 950 1093 1261 650 235 996 876 504 925 1344 450 1010 273 -1 1144 1041 717 -1 164 -1 11 798 419...
result:
ok 100 numbers
Test #5:
score: 0
Accepted
time: 23ms
memory: 34696kb
input:
1000 1010011001 1100000000 1 1111001110 100100011 1 10000001 1110100110 1 1001000010 1111011110 1 11110001 101101110 1 10110001 110010 1 110111100 1111011111 1 1010101010 1111110000 1 11010110 11000110 1 1101101100 10001101 1 1101000110 111100110 3 1101100 10110 1 1001101001 10010001 1 1000110100 11...
output:
633 1267 752 627 629 257 1173 465 21 916 1361 145 1250 1006 155 783 412 684 400 1126 1204 185 298 932 535 246 1094 325 272 -1 -1 389 164 -1 -1 644 436 1271 261 741 351 212 985 426 236 1356 952 1256 1039 911 709 547 1349 142 229 1077 538 48 1089 378 1152 524 218 1161 485 884 751 299 206 268 95 933 76...
result:
ok 1000 numbers
Test #6:
score: 0
Accepted
time: 27ms
memory: 34708kb
input:
1000 100110100101100101010111110010101010110011100011111101110010010001011001100100000001101110101111101 1110001111001100110000111010010101001111100010101010110110101001000001001000011101000011001110101011 1 11101111001001100011000010001010001011001101011110011011100111011111000000010000110100101001...
output:
218980472 -1 -1 517518581 -1 -1 85094150 666890546 885064041 -1 -1 189310507 730304733 -1 659799430 794266104 -1 -1 -1 760479713 644678967 837810902 535065049 -1 -1 -1 186342775 939519657 -1 257634724 172396207 442878387 -1 495325667 951414912 -1 -1 -1 714507638 -1 525066268 -1 -1 -1 920213221 -1 -1...
result:
ok 1000 numbers
Test #7:
score: 0
Accepted
time: 31ms
memory: 34728kb
input:
1000 1101010010111010000111000000000101000000111101010010010101110011000000111011010000110111000101001101010101110100000111000110110101100001111100010010001000011100100111100100000100101100001111010010000010111101010000000110011100011100100000010111110100000111010010110111000111010000101011011111011...
output:
392697873 -1 -1 -1 337638914 150474497 812988479 14301059 242433325 207160298 -1 345593651 -1 649843860 -1 -1 904010827 -1 505608125 898864826 772130764 5160799 234942297 -1 84958267 -1 -1 -1 -1 732394003 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 522542096 -1 349811717 -1 -1 -1 52557246 -1 850414...
result:
ok 1000 numbers
Test #8:
score: 0
Accepted
time: 80ms
memory: 34764kb
input:
1000 1101111111110110100111000010100010011111010100000100100110011010110111110100000100101100110011111011101001001001000000010111010001111100101101111000010011010010111110111000111111100010100011100001010010110011001101110010110011010010110000101010001000101000011001111101001100011011011100011010101...
output:
800723017 736241483 -1 214103223 -1 560328139 -1 -1 -1 -1 -1 -1 627204069 -1 -1 -1 59957998 527911577 364243222 640552596 40541566 561771248 863747051 147600304 -1 -1 665706424 905996351 683049809 136472343 387837991 -1 -1 728303101 -1 579656230 916322837 745095574 -1 -1 999380075 -1 -1 -1 -1 -1 -1 ...
result:
ok 1000 numbers
Test #9:
score: 0
Accepted
time: 96ms
memory: 34796kb
input:
1000 0 10000010011110111011010111111011001101110001001001100001110011100100011111000001001111000010110101100001101111111110110100010000100001001101001111100000111100001101110101100001101111110001001101100000001010110110101100111110100010010111101011000111111010011110001111001111001111001101011000000...
output:
58376942 300766824 414156121 -1 -1 -1 -1 88479909 720713306 306938941 -1 423848104 440743683 478829933 -1 462661101 889252617 -1 -1 -1 964856420 -1 -1 -1 -1 -1 82855520 -1 -1 3110379 686092492 931632750 -1 -1 -1 -1 940831778 488427141 -1 -1 661417338 116153160 -1 425604704 458005044 -1 159078900 921...
result:
ok 1000 numbers
Test #10:
score: 0
Accepted
time: 117ms
memory: 34872kb
input:
100 11110010010001000100010111001111000100110100101010111000100000110110111001101100000101101000111011101010011111011011101000100000101111010011011100101111001010101010000110000100100010010011011100110101100110000001010011110011010010000110001010001111100110101101110011000111101010010111110101001000...
output:
462011783 521025699 287271357 570655586 456767304 329006899 238484791 947067110 -1 321339742 892341001 341864209 957855854 921186081 566465880 771098276 874776895 342528323 614989005 253849992 494496838 786564559 531120498 191845391 -1 848544140 442763668 154392835 320194212 -1 942226479 835067908 7...
result:
ok 100 numbers
Test #11:
score: 0
Accepted
time: 106ms
memory: 39172kb
input:
10 100010011010101111000101100000111000000010001111111000000100000001001011110011100000001010101110010001111100111000001110011001000110000101001100110100100001000001010001001111001100100001001000001001101000001100010001011111011111111011111111011000100100001000011111000100000001000111000111110001100...
output:
-1 -1 274714929 384784303 207381248 -1 928083397 -1 651865477 38209655
result:
ok 10 numbers
Test #12:
score: 0
Accepted
time: 159ms
memory: 34696kb
input:
100000 101001001101010000011110011 110100000001100000000011001010100111000010010000001100011100000010010 1 1001111000001110111010001011001110001011010000110000011100000100110000 111001011001001110101000010100 1 1111000100101000001011111100010100010101010100110100010110010110000 110101000010011100001...
output:
632145185 400205347 234734936 -1 843239926 943197772 -1 33248281 343066805 879147467 113127988 872252209 801735279 -1 -1 -1 375307518 -1 -1 -1 723430324 599663758 72686015 625897124 600699345 876415884 -1 185570509 296533591 183514003 -1 223858775 842750716 294113333 889586630 -1 36491106 725331632 ...
result:
ok 100000 numbers
Test #13:
score: -100
Runtime Error
input:
100000 10011001111000111101010100011110000010100001011111 10011001111000111101010100011110000010100001011111 1000000000 10101010000110001000111000000110011001011111111000 10101010000110001000111000000110011001011111111000 1000000000 1111101101110001000000111111001011011110010011100 11111011011100010...