首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Code Chef DSA学习系列:3的倍数

Code Chef DSA学习系列:3的倍数
EN

Stack Overflow用户
提问于 2020-09-10 19:08:57
回答 2查看 942关注 0票数 0

考虑一个非常长的K位数N,其中包含数字d0、d1、...、dK-1 (以十进制记法表示;d0是最高有效位,dK-1是最低有效位)。这个数字太大了,我们不能在输入时显式地给出它;相反,你只能给出它的起始数字和构造数字的余数的一种方法。

具体地说,你得到了d0和d1;对于每个i≥2,di是前面所有(更重要的)数字的和,模10 -更正式地说,以下公式必须成立:

确定N是否为3的倍数。

输入

输入的第一行包含一个整数T,表示测试用例的数量。测试用例的描述如下。每个测试用例的第一行也是唯一一行包含三个空格分隔的整数K、d0和d1。

输出

对于每个测试用例,如果数字N是3的倍数,则打印包含字符串"YES“(不带引号)或"NO”(不带引号)的一行。

约束条件1≤T≤1000

2≤K≤1012

1≤d0≤9

0≤d1≤9

示例

输入:

3.

5 3 4

13 8 1

760399384224 5 1

输出:

不是

解释

示例情况1:整数N是34748,不能被3整除,所以答案是否定的。

示例2:整数N是8198624862486,可以被3整除,所以答案是肯定的。

问题已结束

this问题中,在给定的示例测试用例中,我们有k=760399384224、d0=5和d1=1。现在我们知道,如果一个数字的位数之和是3的倍数,那么它就是3的倍数。因此,在这里应用它,我们将数字n分成3部分。

第1部分:前3位-> 516,(5+1+6) mod 3 ==0,因此rem1 = 0。

第二部分:接下来是(2486)的(k-3)/4次重复,或者,rem2 = ((2+4+8+6)*((k-3)/4))%3= 1

第3部分:最后(k-3)%4 =1位数字将是2(来自2486重复),因此rem3 = 2%3=2

所以最终的答案应该是(rem1+rem2+rem3)%3

我为这个逻辑写了下面的代码:

代码语言:javascript
复制
#include<iostream>
#define ll long long
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
         ll k;
         cin>>k;
         int d0,d1;
         cin>>d0>>d1;
         int d2 = (d0+d1)%10;
         int d[4];
         d[0] = (d0+d1+d2)%10;
         d[1] = (2*d[0])%10;
         d[2] = (2*d[1])%10;
         d[3] = (2*d[2])%10;
         ll rem1 = (d0+d1+d2)%3,rem2,rem3=0;
         rem2 = (20*(((k-3)/4)%3))%3;
         ll x = (k-3)%4;
         if(x!=0)
         {
            for(int i=0; i<x; ++i)
            rem3+=d[i];
            rem3 = rem3%3;
         }
         else
             rem3 =0;
         if(k==2)
         {
             rem1 = (d0+d1)%3;
             rem2=0;
             rem3=0;
         }
         if((rem1+rem2+rem3)%3==0)
            cout<<"YES"<<endl;
         else
            cout<<"NO"<<endl;
    }
}

现在他们在他们的测试用例中给了我WA。我想不出一个可能的测试用例不能与此代码一起工作。所以请谁帮帮我。

EN

回答 2

Stack Overflow用户

发布于 2020-09-11 04:29:02

这里有一个明显的不匹配。您可能可以使用以下JavaScript代码来查找更多信息:

代码语言:javascript
复制
function f(k, d0, d1){
  let d2 = (d0+d1)%10;
  let d = new Array(4).fill(0);
  d[0] = (d0+d1+d2)%10;
  d[1] = (2*d[0])%10;
  d[2] = (2*d[1])%10;
  d[3] = (2*d[2])%10;
  let rem1 = (d0+d1+d2)%3, rem2, rem3=0;
  rem2 = (20*((~~((k-3)/4))%3))%3;
  let x = (k-3)%4;
  if(x!=0)
  {
    for(let i=0; i<x; ++i)
    rem3+=d[i];
    rem3 = rem3%3;
  }
  else
      rem3 =0;
  if(k==2)
  {
      rem1 = (d0+d1)%3;
      rem2=0;
      rem3=0;
  }
  if((rem1+rem2+rem3)%3==0)
    return true

  return false
}

function bruteForce(k, d0, d1){
  let d = (d0 + d1) % 10;
  let n = 10 * d0 + d1;
  for (let i=3; i<=k; i++){
    n = 10 * n + d;
    d = (2 * d) % 10;
  }
  return [n % 3 == 0, n];
}

let str = "";

str += "Examples:\n";
str += "(5, 3, 4)\n" + bruteForce(5, 3, 4) + "\n\n";
str += "(13, 8, 1)\n" + bruteForce(13, 8, 1) + "\n\n"

var k = 7;
var mismatch = false;

for (let i=1; i<10; i++){
  for (let j=0; j<10; j++){
    const _f = f(k, i, j);
    const _bruteForce = bruteForce(k, i, j);

    if (_bruteForce[0] != _f){
      str += "Mismatch:\n" + 
        `(${ k }, ${ i }, ${ j })\n` +
        "f: " + _f +
        "\nbruteForce: " + _bruteForce + "\n\n";
      mismatch = true;
    }
    if (mismatch)
      break;
  }
  if (mismatch)
    break;
}

console.log(str);

票数 0
EN

Stack Overflow用户

发布于 2021-04-22 22:36:20

代码语言:javascript
复制
#include <stdio.h>

void isMulti3(long long int K, long long int d0, long long int d1) {
    long long int mod1 = (d0 + d1) % 10;

    long long int sum_mod1 = d0 + d1 + mod1;
    
    long long int rep = (K-3)/4;
    long long int mod2[4];
    mod2[0] = (2*mod1) % 10;
    mod2[1] = (4*mod1) % 10;
    mod2[2] = (8*mod1) % 10;
    mod2[3] = (6*mod1) % 10;

    long long int sum_mod2 = 0;
    for(int i = 0; i < 4; i++) {
        sum_mod2 += mod2[i];
    }

    long long int unrep = (K - 3) % 4;
    long long int sum_mod3 = 0;
    for(int i = 0; i < unrep; i++) sum_mod3 += mod2[i]; 
    long long int isMod1 = sum_mod1 % 3;
    long long int isMod2 = ((rep%3)*(sum_mod2%3)) % 3;
    long long int isMod3 = sum_mod3 % 3;

    if((isMod1 + (isMod2 + isMod3)%3)% 3 == 0) printf("YES\n");
    else printf("NO\n");

}
int main() {
    int T;
    scanf("%d", &T);

    for(int i = 0; i < T; i++) {
        long long int K;
        long long int d0, d1;
        scanf("%lld %lld %lld", &K, &d0, &d1);
        if(K == 2) {
            if((d0 + d1) % 3 == 0) printf("YES\n");
            else printf("NO\n");
        }
        else isMulti3(K, d0, d1);


    }
}

我想你就是在codechef讨论门户上问这个问题的那个人。我在那里回答了这个问题,我正在分享这个链接。https://discuss.codechef.com/t/dsa-learning-series-multiple-of-3/77174/4?u=nazishkaunain所以你错了的地方是:

你可以使用这样的事实:(a+b+c)mod3 != amod3+bmod3+cmod3;但是(a +b+ c) mod3=(amod3+(bmod3+cmod3)mod3)mod3)mod3;只有当n mod3= 0 => (a +b+ c) mod3=0时,n(n=a+b+ c)才能被3整除。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63828434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档