我到处都找遍了,我只找到了(aB)%k的解,即((a%k)(b%k))%k。
我想写它的代码。假设我已经给了一个数组的数字a1,a2,a3,a4...,an。我必须找出乘积的数字任何子集从数组是否可被k整除。
如果(ai *aj.. *am %k == 0)返回真;
我想要c++的代码。
验证码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main() {
ll t;
cin >> t;
while(t--)
{
ll n , k ;
cin >> n >> k;
vector<ll>a;
ll product = 1;
int flag =0;
for(ll i =0 ; i < n ; i++)
{
int p;
cin >>p;
a.push_back(p);
if(p % k == 0)
{
flag = 1;
}
p = p%k; ................................(eqn 1)
product = product * p;
product = product %k; .................................(eqn 2)
}
if(flag == 1)
{
cout << "YES" << "\n";
continue;
}
product = product %k; ...............................(eqn 3)
if(product == 0)
{
cout << "YES" << "\n";
}
else
cout << "NO"<< "\n";
}
return 0;
}
此代码通过所有测试用例。如果我从代码中删除公式1,它也将通过之后的所有测试用例。但如果我删除公式2,代码将其作为错误答案。https://www.codechef.com/problems/DIVBYK
你能告诉我它背后的概念吗?
1条答案
按热度按时间dkqlctbz1#
概念是对于
a1,a2,b1,b2
满足:它认为
换句话说,两个数相乘的余数等于两个数相乘的余数。
这是非常方便的,因为后者在
k<sqrt(largest_representable_number)
时不会发生溢出。人们可以用归纳法证明N个数的乘积也是如此。