基础组月赛T2求条

#include <bits/stdc++.h>
#define int long long
using namespace std;
bool is_sqrt(int x){
    int p=sqrt(x);
    return p*p==x;
}
bool is_prime(int x){
    if(x<2) return false;
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0){
            return false;
        }
    }
    return true;
}
signed main(){
	freopen("202504B.in","r",stdin);
	freopen("202504B.out","w",stdout);
    int l,r;
    cin>>l>>r;
    while(is_sqrt(l)==false){
        l++;
    }
    int p=sqrt(l)*2-1;
    int all=1,flag=0;
    for(int i=l;i<=r;i+=p){
        int s=i;
        int sum=0;
        while(s){
            int t=s%10;
            sum+=t;
            s/=10;
        }
        if(is_prime(sum)==true){
            all*=i;
            all%=998244353;
            flag=1;
        }
        p+=2;
    }
    if(flag==1){
        cout<<all%998244353;
    }else{
        cout<<0;
    }
}

题面:

题目描述

小信非常热爱数学,有一天他在研究数字时发现有一种数不仅自身是完全平方数,而且它的各位数位和还是质数。例如49,本身是完全平方数:7*7=49,数位和4+9=13还是质数。小信称这种数为“平方质和数”。
现在他想借助计算机寻找 L 到 R(包含 L 和 R)之间的所有平方质和数,计算它们的乘积,然后结果对 998244353 取模,请你帮帮他。

输入格式

一行,输入两个正整数 L,R。

输出格式

输出 L 到 R(包含 L 和 R)的正整数中,平方质和数的乘积,结果对 998244353 取模。若不存在平方质和数,则输出 0。

样例

Input 1

1 30

Output 1

400

数据范围

对于 30\% 的测试点:1≤L≤R≤1000
对于 100\% 的测试点,1≤L≤R≤10^{12}

1 个赞

是这里的问题么??

1 个赞

应该不是吧

1 个赞

什么错误,几分

1 个赞

WA70分

2 个赞

同学你好,我花点时间看看

2 个赞

还在吗QwQ

1 个赞

在的,有题号吗,我试一下,基础月赛我进不去

1 个赞

额,没有。。。

1 个赞

好吧,我再看看

2 个赞

我感觉大致思路是没问题的,应该是有些小毛病,比较难找

2 个赞

嗯。

1 个赞

*冒泡

1 个赞

@高梓陌 找到问题了

问题:

i可能超过998244353,[结果超出LL范围(猜测)]

解决方法

all*=i;改为all*=i%998244353;

2 个赞

牛的同学

2 个赞

好的,谢谢!

1 个赞

@LeuR @yangshe @栗子酱 @椰子糕 关帖

1 个赞