当前位置: 首页 > 知识库问答 >
问题:

以和为素数的特殊对

邹海荣
2023-03-14

数值N的范围为1<=N<=10^50函数f(x)定义为一个数x的所有数字之和。我们必须求特殊对(x,y)的个数的计数,使得:
1。0<=x,y<=n
2。F(x)+F(y)本质上是素数
我们只能对(x,y)(y,x)计数一次。打印输出的模1000000000+7

我的方法:
因为给定范围内的数字和的最大值可以是450(如果长度为50的数字中所有字符都是9,则9*50=450)。因此,我们可以创建一个大小为451*451的二维数组,并且对于所有的对,我们可以存储它是否为素数。
现在,我面临的问题是在线性时间内找到给定数N的所有对(x,y)(显然,我们不能通过10^50循环找到所有的对)。是否有人建议任何方法,或任何公式(如果存在的话),以得到所有的对在线性时间。

共有1个答案

尤飞尘
2023-03-14

您可以创建一个大小为451*451的二维数组,对于所有的对,我们可以存储它是否为素数。同时,如果你知道有多少个小于n的数是F(x)=i,有多少个是F(x)=j,那么在检查(i+j)是否为素数后,你就可以很容易地找到一个状态为(i,j)的二维数组大小为451*451的结果。

所以你需要找到F(x)=i的总数。

您可以很容易地使用数字DP:

string given=convertIntToString(given string);
int DP[51][2][452]= {-1};
Initially all index hpolds -1;
int digitDp(int pos,int small,int sum)
{
    if(pos==given.size())
    {
        if(sum==i) return 1;
        else return 0;
    }
    if(DP[pos][small][sum]!=-1)return DP[pos][small][sum];
    int res=0;
    if(small)
    {
        for(int j=0; j<=9; j++)res=(res+digitDp(pos+1,small,sum+j))%1000000007;
    }
    else
    {
        int hi=given[pos]-'0';
        for(int j=0; j<=hi; j++)
        {
            if(j==hi)res=(res+digitDp(pos+1,small,sum+j))%1000000007;
            else res=(res+digitDp(pos+1,1,sum+j))%1000000007;
        }
    }
    return DP[pos][small][sum]=res;
}
int res[452];
for(i=0;i<=451;i++){
  memset(DP,-1,sizeof DP);
  res[i]=digitDp(0,0,0);
}

现在测试每一对(i,j):

int answer=0;
for(k=0;k<=451;k++){
   for(int j=0;j<=451;j++){
       if(isprime(k+j)){
         answer=((log long)answer+(long long)res[k]*(long long)res[j])%1000000007;
      }
   }
}

最后的结果将回答/2,因为(i,j)和(j,i)将被计算一次。

Although there is a case for i=1 and j=1 , Hope you will be able to  handle it.
 类似资料:
  • 我如何用java8流式API表达这一点? 我想对流中的每个项执行itemcumer。如果没有要执行的项目,则清空操作。 我当然可以写这样的东西: 但我更愿意避免任何s。 我还考虑过在peek方法中设置一个标志,但该标志是非最终的,因此是不允许的。使用布尔容器似乎也是一种太多的变通方法。

  • 我需要一个正则表达式来验证, 长度应该是18 前5个字符应该是(xyz34|xyz12) 其余13个字符只能是字母和数字,不允许有空格或特殊字符。 我有一个这样的模式, 但这允许空格和特殊字符,如($、%等),这违反了规则#3。 有没有建议排除这个空格和特殊字符,并严格检查它必须是字母和数字?

  • 本文向大家介绍C ++中具有3个数组元素的特殊三元组的总和,包括了C ++中具有3个数组元素的特殊三元组的总和的使用技巧和注意事项,需要的朋友参考一下 在此问题中,给定3个数组X,Y,Z。我们的任务是创建一个程序,以查找包含3个数组中的元素的特殊三元组的和。 特殊三元组是具有以下属性的特殊三元组类型- 对于(a,b,c):a≤b且b≥c ,即三元组的中间元素应比其他两个元素要好。 并且,三元组的值

  • 我正在尝试在php中创建以下元素,以创建我们的一个客户所需的xml。 每件事都很好,但我不知道如何创建以下元素 我已经尝试了几种方法,但仍然无法正确生成上述示例 有人能送我上路吗? 这是我的代码

  • 4.6. and 和 or 的特殊性质 4.6.1. 使用 and-or 技巧 在Python 中,and 和 or 执行布尔逻辑演算,如你所期待的一样,但是它们并不返回布尔值;而是,返回它们实际进行比较的值之一。 例 4.15. and 介绍 >>> 'a' and 'b' 'b' >>> '' and 'b' '' >>> 'a' and 'b' and

  • 当我阅读Eclipse的源代码时,我发现了一个名为“$classname$.java”的文件。其部分内容如下: 我试图提取if的AST,然后我出现了一个错误。“%if”和“%endif”在Java中是什么意思?我怎么才能得到它的AST呢?