AtCoder - 4172 Modulo Summation 貪心

開始想複雜的了 仔細觀察樣例後發現這個數 其實就是所有的數的LCM-1嗎

只有LCM-1 對所有數取模的時候才能對所有數得到MOD = a[i]-1;

那麼一個X%Y得到的最大值就是Y-1

於是得到了這個代碼

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<sstream>
typedef long long LL;
using namespace std;

LL a[3010];
LL Gcd(LL A,LL B){
    return B==0?A:Gcd(B,A%B);
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    LL s = a[1];
    for(int i = 2;i<=n;i++){
    
        LL gcd = Gcd(s,a[i]);
        s = s/gcd*a[i];
    }

    s--;
    LL sum=0;
    for(int i=1;i<=n;i++){
        sum+=s%a[i];
    }
    printf("%lld\n",sum);
    return 0;
}

我呢 就真的按照分析好的思路去實現了 求一遍所有數的LCM 然後-1 在逐個取模

然後輕而易舉的WA 了   

因爲 如果是大質數 

...

9013 9029 9041 9043 9049 9059 9067 9091 9103 9109 
9127 9133 9137 9151 9157 9161 9173 9181 9187 9199 
9203 9209 9221 9227 9239 9241 9257 9277 9281 9283 
9293 9311 9319 9323 9337 9341 9343 9349 9371 9377 
9391 9397 9403 9413 9419 9421 9431 9433 9437 9439 
9461 9463 9467 9473 9479 9491 9497 9511 9521 9533 
9539 9547 9551 9587 9601 9613 9619 9623 9629 9631 
9643 9649 9661 9677 9679 9689 9697 9719 9721 9733 
9739 9743 9749 9767 9769 9781 9787 9791 9803 9811 
9817 9829 9833 9839 9851 9857 9859 9871 9883 9887

...

那麼10個大於10^3的質數相乘就能得到一個大致10^30的數 由於他們是互質的 所以必然爆LL

那麼還不如直接貪心了 既然我們已經知道最後的結論 爲什麼不直接累加呢?

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<sstream>
typedef long long LL;
using namespace std;

LL a[3010];
int main()
{
    int n;
    scanf("%d",&n);
    int s=0;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]),s+=a[i]-1;

    printf("%d\n",s);
    return 0;
}

於是就得到了真正的AC代碼.....

有時還是不能直接按照思路去寫代碼 要思考下實現細節在輸入規模下可不可行 如果不可行 可不可以化簡

這道題就是一個利用分析結論直接求解的題目 如果按照正確的分析過程去解就會出錯 而是要多繞一個彎子

最簡的解法就是最安全的解法,就是條件最少的解法。最不會出錯的解法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章