HDU - 6646 (杭電多校第七場(chǎng) A + B = C )思維

題意:給出a琐鲁,b,c人灼。求x围段,y,z滿足a\cdot 10^x+b\cdot 10^y=c\cdot 10^z 投放。a,b,c \le 10^{100000}

題解:先把a(bǔ)奈泪,b,c去掉末尾的0得到A, B, C灸芳。這樣我們要解的方程就是:A\cdot 10^l+B\cdot 10^m=C\cdot 10^n 涝桅。

  • 如果n>0 , 那么有l=m=0 烙样, 因?yàn)锳和B的末尾都不是0
  • 如果n=0 冯遂, 那么lm 中至少有一個(gè)為0,因?yàn)镃的末位不是0
    • 根據(jù)末位判斷一下哪一個(gè)是0就好了

但是高精度又慢又寫(xiě)起來(lái)很麻煩误阻。所以我們可以采用hash的想法债蜜,對(duì)一個(gè)大質(zhì)數(shù)取mod然后加減乘除判斷相等都很容易

btw, 這個(gè)題對(duì)java相當(dāng)不友好晴埂,用java自帶的BigInteger根本過(guò)不了,比賽的時(shí)候浪費(fèi)了好幾個(gè)小時(shí)去調(diào)高精度的板子寻定。不過(guò)取模之后就能大大節(jié)省時(shí)間

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#define int int64_t
using namespace std;
using pii = pair<int, int>;
const int mod = 355542559;
const int maxn = 1e6 + 10;

int bin(int x,int n,int MOD){
    int ret = MOD != 1;
    for (x %= MOD; n; n >>= 1,x=x*x%MOD){
        if(n&1)
            ret = ret * x % MOD;
    }
    return ret;
}

inline int get_inv(int x,int p){
    return bin(x, p - 2, p);
}

string remove_zero(const string &a)
{
    int res = 0;
    for (int i = a.length() - 1; i >= 0; i--)
    {
        if (a[i] == '0')
            res++;
        else
            break;
    }
    return a.substr(0, a.length() - res);
}

int powten(int val){
    static vector<pii> vec;
    if(vec.size()==0){
        for (int i = 1, cnt = 0; cnt < maxn;cnt++,i=i*10%mod){
            vec.emplace_back(i, cnt);
        }
        sort(vec.begin(), vec.end());
    }
    auto it = lower_bound(vec.begin(), vec.end(), make_pair(val, 0ll));
    if(it->first==val){
        return it->second;
    }
    return -1;
}

int last_digital(const string &str)
{
    int len = str.length() - 1;
    return str[len] - '0';
}

int go(const string& str){
    int res = 0;
    for(auto ch:str){
        res = (res * 10 + ch - '0') % mod;
    }
    return res;
}

int32_t main()
{
    ios::sync_with_stdio(false);
    int _;
    cin >> _;
    while (_--)
    {
        string a, b, c;
        cin >> a >> b >> c;
        string za1 = remove_zero(a);
        string zb1 = remove_zero(b);
        string zc1 = remove_zero(c);
        int ra = a.length() - za1.length();
        int rb = b.length() - zb1.length();
        int rc = c.length() - zc1.length();
        auto za = go(za1);
        auto zb = go(zb1);
        auto zc = go(zc1);

        int m = last_digital(za1);
        int n = last_digital(zb1);
        int p = last_digital(zc1);
        int x = (int)-1e9, y = (int)-1e9, z = (int)-1e9;
        if (m == p)
        {
            auto tmp = (zc - za + mod) % mod;
            int pow = powten(tmp * get_inv(zb,mod) % mod);
            if (pow >= 0)
            {
                x = rb + rc - pow;
                y = ra + rc;
                z = ra + rb - pow;
            }
        }

        if (n == p)
        {
            auto tmp = (zc - zb + mod) % mod;
            int pow = powten(tmp * get_inv(za, mod) % mod);
            if (pow >= 0)
            {
                x = rb + rc;
                y = ra + rc - pow;
                z = ra + rb - pow;
            }
        }
        auto tmp = za + zb;
        int pow = powten(tmp * get_inv(zc, mod) % mod);
        if (pow >= 0)
        {
            x = rb + rc - pow;
            y = ra + rc - pow;
            z = ra + rb;
        }
        if (x == (int)-1e9)
        {
            cout << -1 << endl;
        }
        else
        {
            int _min = min(x, min(y, z));
            x -= _min;
            y -= _min;
            z -= _min;
            int _max = max(x, max(y, z));
            if (_max > int(1e6))
            {
                cout << -1 << endl;
            }
            else
                cout << x << " " << y << " " << z << endl;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儒洛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子狼速,更是在濱河造成了極大的恐慌琅锻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件向胡,死亡現(xiàn)場(chǎng)離奇詭異恼蓬,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)僵芹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)处硬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人拇派,你說(shuō)我怎么就攤上這事荷辕。” “怎么了件豌?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵疮方,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茧彤,道長(zhǎng)骡显,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任曾掂,我火速辦了婚禮惫谤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘遭殉。我一直安慰自己石挂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布险污。 她就那樣靜靜地躺著痹愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛔糯。 梳的紋絲不亂的頭發(fā)上拯腮,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音蚁飒,去河邊找鬼动壤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛淮逻,可吹牛的內(nèi)容都是我干的琼懊。 我是一名探鬼主播阁簸,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哼丈!你這毒婦竟也來(lái)了启妹?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤醉旦,失蹤者是張志新(化名)和其女友劉穎饶米,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體车胡,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檬输,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匈棘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丧慈。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖羹饰,靈堂內(nèi)的尸體忽然破棺而出伊滋,到底是詐尸還是另有隱情碳却,我是刑警寧澤队秩,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站昼浦,受9級(jí)特大地震影響馍资,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜关噪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一鸟蟹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧使兔,春花似錦建钥、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欲险,卻和暖如春镐依,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背天试。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工槐壳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喜每。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓务唐,卻偏偏與公主長(zhǎng)得像雳攘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枫笛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348