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\n",ans.size()); 27 for(set<int>::iterator i=ans.begin();i!=ans.end();i++) 28 printf("%d ",*i); 29 }