题解
MatrixGroup · · 题解
前言
非常 Educational 的一道题。
题意
构造一个数字串,正写
做法 1(Subtask 0)
显然一位数正读倒读都是它自己,输出
做法 2(Subtask 1,2)
考虑手玩或打表。
做法 3(a=0,c=1 )
定义
考虑构造
期望得分:
做法 4(Subtask 5)
考虑两个问题,
- 如何去掉
a=0 这个特殊限制。 - 如何去掉前后缀的
0 。
对于
由此,我们可以想到如下构造:
显然,这样构造出来的数正着读余
我们考虑如何去掉前后缀的
为何数据不随机的情况下这个算法是正确的呢?
借用机器的算力我们可以证明:考虑这么一个事情,我们假如让每一个数取
实际上,有很多对撞算法也可以以很高概率得到正解,因为没法对着卡,所以本题数据实际上是随机造的。
Bonus
保证数据随机,请你保证答案在
代码:
#include <bits/stdc++.h>
#define rep(i,n) for(int i=0,_##i##__end=(n);i<_##i##__end;++i)
#define pb push_back
#define mp make_pair
typedef long long ll;
using namespace std;
const ll mod1=998244353;
const ll g=10;
const ll inv_g=299473306;
const string f15="649938929839946";
string s,t;
int rev(ll x)
{
ll v=0;
rep(i,18)
{
v=v*10+x%10;x/=10;
}
return v%mod1;
}
string revv(ll x)
{
string f="";
rep(i,18)
{
f+=char('0'+x%10);x/=10;
}
return f;
}
map<int,int> idx;
string gett(ll a)// mod 0 = a
{
string v="";
int c=15;rep(i,c)a=a*inv_g%mod1;
while(!idx.count(a))
{
a=a*inv_g%mod1;
++c;
}
int fst=idx[a];
v=revv(fst*mod1);
rep(i,c-15) v+="0";
v+=f15;
return v;
}
void init()
{
rep(i,1000001) idx[rev(i*mod1)]=i;
}
void solve()
{
int a,b;
cin>>a>>b;
s=gett(a);t=gett(b);
reverse(t.begin(),t.end());cout<<t<<s<<endl;
}
int main()
{
init();
ios_base::sync_with_stdio(false);
int t,c;cin>>t>>c;
while(t--)
solve();
return 0;
}