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;
}
posted @ 2025-05-18 21:14  Guaninf  阅读(14)  评论(0)    收藏  举报