2109C3 Div. 2 Round 1025
题意
给定一个数字\(n\)($ 1 \le n \le 10^{9}\() , 有一个未知数\)x$ , 在最小次操作内将\(x\)变为\(n\)
操作1 : 加上\(k( -10^{18} \le k \le 10^{18})\)
操作2 : 除\(k(-10^{18}\le k \le 10^{18})\)
操作3 : 乘\(k(1-10^{18}\le k \le 10^{18})\)
操作4 : digit , 取得各位数字之和
思路
神奇的数字999999999
为什么\(999999999\)神奇 ?
\(999999999 = 9 \times 111111111\) ,而\(111111111\)的digit为9 , 所以能被9整除 , 而9也能被9整除 , 因此如果一个数字乘\(999999999\) , 那么结果的位数之和为81的倍数
考虑\(x \times 999999999 = x \times (1000000000 - 1) = x<<10_{(10)} - x\) , 考虑拆为\((x-1)<<10_{(10)} +10000000000 - x\) , 那么左9位和右9位互补 , 所以digit后为81
(天哪)
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long int
void solve() {
int n;
int tmp;
cin>>n;
cout<<"mul 999999999"<<endl;
cin>>tmp;
cout<<"digit"<<endl;
cin>>tmp;
if (n == 81) {
cout<<"!"<<endl;
cin>>tmp;
return ;
}
cout<<"add "<<n-81<<endl;
cin>>tmp;
cout<<"!"<<endl;
cin>>tmp;
}
signed main() {
int t;
cin>>t;
while (t--) solve();
return 0;
}

浙公网安备 33010602011771号