zoukankan      html  css  js  c++  java
  • codeforces 1010 C. Border【exgcd】

    题目链接:戳这里

    学习博客:戳这里

    题意:给n种数,n种数取任意个任意组合相加为sum,求sum%k有哪些值。

    解题思路:

    由exgcd可知(具体用到的是贝祖定理),ax + by = c,满足gcd(x,y)|c。那么我们可以设sum=a1*x1+a2*x2+a3*x3...an*xn,即sum%k=a1*x2+a2*x2+a3*x3...+an*xn-ak*xk=a1*x1+a2*x2+a3*x3+...+an*xn+ak*xk,满足gcd(x1,x2...xn,xk)|(sum%k)。

    因此遍历0~k-1与gcd相乘即为答案。

    附大佬代码:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int gcd(int a,int b)
     6 {
     7     if(a<b)
     8         swap(a,b);
     9     return (b==0)?a:gcd(b,a%b);
    10 }
    11 
    12 int main()
    13 {
    14     int n,k;
    15     scanf("%d%d",&n,&k);
    16     int g=0;
    17     for(int i=0;i<n;i++)
    18     {
    19         int t;
    20         scanf("%d",&t);
    21         g=gcd(g,t);
    22     }
    23     set<int> ans;
    24     for(long long i=0,s=0;i<k;i++,s+=g)
    25         ans.insert(s%k);
    26     printf("%d
    ",ans.size());
    27     for(set<int>::iterator i=ans.begin();i!=ans.end();i++)
    28         printf("%d ",*i);
    29 }
    View Code
  • 相关阅读:
    存储过程
    sdsdsd
    sdsdd
    sdsd
    sdasd
    mysql触发
    c#连接mysql答题步骤
    c#mysql数据库
    nginx
    linux如何查看端口被何进程占用
  • 原文地址:https://www.cnblogs.com/zmin/p/9519530.html
Copyright © 2011-2022 走看看