Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)
Posted luowentao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)相关的知识,希望对你有一定的参考价值。
题目描述
有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上a1,a2,...,an中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能。
输入描述:
第一行两个整数n,m
接下来一行n个整数表示a1,a2,...,an
1≤n≤100
1≤m,a1,a2,...,an≤1000000000
输出描述:
输出一个整数表示答案
示例1
输出
复制3
题解:假设K1为A1取的个数;根据题意题目变成a1*k1+a2*k2+a3*k3+a4*k4+....an*kn=P%M;
让我们求P的可能性,
用到了https://blog.csdn.net/huayunhualuo/article/details/52215182
在数论中,裴蜀等式或裴蜀定理是一个关于最大公约数(或最大公约式)的定理。裴蜀定理得名于法国数学家艾蒂安·裴蜀,说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性丢番图方程(称为裴蜀等式):
ax+by=max+by=m
有整数解时当且仅当m是d的倍数。裴蜀等式有解时必然有无穷多个整数解,每组解x、y都称为裴蜀数,可用扩展欧几里得算法求得。
例如,12和42的最大公约数是6,则方程12x+42y=6有解。事实上有(-3)×12 + 1×42 = 6及4×12 + (-1)×42 = 6。特别来说,方程 ax+by=1 有整数解当且仅当整数a和b互素。
所以这题求N个数关于M的余数;就把N个数的gcd求出来然后求小于M的GCD的倍数的个数就是答案;
代码”
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=998244353; const int maxn=3e6+50; const ll inf=0x3f3f3f3f3f3f; ll gcd(ll a, ll b) { if(b == 0) return a; return gcd(b, a % b); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int n,k; cin>>n>>k; int i,tmp=0; ll sum = k; ll t; for(int i = 1; i <= n; ++i) { cin >> t; sum = gcd(sum, t); } cout<<ll(k/sum)<<endl; return 0; }
以上是关于Wannafly挑战赛22 A-计数器(gcd,裴蜀定理)的主要内容,如果未能解决你的问题,请参考以下文章