2022 杭州 A

A. Modulo Ruins the Legend

因为是%m的意义下 我们尽量一直保持在%意义下 不然会很难注意一些不合法情况
原式可变形为(n(n+1)/2 d + ns + sum )%m 最小
我们设a=n
(n+1)/2 b=n
(ad+bs+sum)%m
设g1=gcd(a,b) 里面的ad+bs又exgcd可得
(kg1+sum)%m
这里就可以发现这里如果直接写的话 sum可能大于m的 g1也可能大于m的 这样求出来的k可能是负数
这样回代的时候就可能搞成负数
将%m放里面来搞一搞
(kg1+mt+sum%m)%m
左边两个也是只有t和k不知道 g2=gcd(g1,m) sum2=sum%m
(zg2+sum2)%m
我们直接可以将z求出来 m-sum2/g+1 或者 m-sum2/g 必然有一个是贴近m的也就是最小值
而且这样z必然是正数 然后我们就无脑回代 注意取模就可以了

void solve(){
    cin>>n>>m;
    int sum=0;
    for(int i=0;i<n;i++){
        int x;cin>>x;
        sum+=x;
    }
    int a=n,b=n*(n+1)/2;
    int s,dt;
    int d=__gcd(n,n*(n-1)/2);
    sum%=m;
    exgcd(a,b,s,dt);
    int k,t;
    int g=__gcd(m,d);
    exgcd(d,m,k,t);
    int z=up(m-sum%m,g);
    (k*=z)%=m;
    s = ((s % m * k) % m + m) % m, dt = ((dt % m * k) % m + m) % m;
    cout << (z * g + sum%m)%m << endl;
    cout << s << " " << dt << endl;
}
posted @ 2022-12-08 22:25  ycllz  阅读(505)  评论(0)    收藏  举报