题解:P14582 [LNCPC 2025] 被抠的键盘
I_am_kunzi · · 题解
P14582 题解
题目思路
首先既然禁用哪些数字是出题人决定的,那么我们就要尽量考虑一种通用的解法,使得可以用尽可能少的数字和步骤得到答案。
观察发现一共有
然后还有一个性质,就是只要数字末尾加足够多的
那么我们就考虑只用一种非零数字和
这时假定除去所有
根据我们小学就学过的知识,并将其形式化书写,如果从低到高第
那么我们只需要找到
这时我们需要输出
最后输出足量
题目代码
#include<iostream>
using namespace std;
bool np[10000005];
int p[5000005];
int phi[10000005];
void calc(int n)
{
np[1] = 1;
phi[1] = 1;
int cntp = 0;
for(int i = 2 ; i <= n ; i++)
{
if(!np[i])
{
p[++cntp] = i;
phi[i] = i - 1;
}
for(int j = 1 ; j <= cntp && i * p[j] <= n ; j++)
{
np[i * p[j]] = 1;
phi[i * p[j]] = phi[i] * phi[p[j]];
if(i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
}
}
}
void solve()
{
long long m , k;
cin >> m >> k;
bool y[10] = {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0};
for(int i = 1 ; i <= k ; i++)
{
int x;
cin >> x;
y[x] = 1;
}
int u = 0;
for(int i = 1 ; i <= 9 ; i++)
{
u = (!y[i] ? i : u);
}
if(!u)
{
cout << -1 << endl;
return ;
}
cout << 2 << endl << u << ' ' << m * phi[m] << endl << 0 << ' ' << 1000000 << endl;
}
signed main()
{
calc(1e7);
int t;
cin >> t;
while(t--)
{
solve();
}
}