c++ (a*b*c)%k的值是多少?

k5hmc34c  于 2022-12-20  发布在  其他
关注(0)|答案(1)|浏览(166)

我到处都找遍了,我只找到了(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
你能告诉我它背后的概念吗?

dkqlctbz

dkqlctbz1#

概念是对于a1,a2,b1,b2满足:

a1 == b1   (mod k)
a2 == b2   (mod k)

它认为

a1*a2 == b1*b2    (mod k)

换句话说,两个数相乘的余数等于两个数相乘的余数。
这是非常方便的,因为后者在k<sqrt(largest_representable_number)时不会发生溢出。
人们可以用归纳法证明N个数的乘积也是如此。

相关问题