社区讨论

这个题 Wa 15了,大家有什么头绪吗?

CF1848EVika and Stone Skipping参与者 2已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo25boqo
此快照首次捕获于
2023/10/23 08:14
2 年前
此快照最后确认于
2023/11/03 08:32
2 年前
查看原帖
提交记录在这
check commit 如下:
wrong answer 7660th numbers differ - expected: '631', found: '0'
我写的是用 map 维护一下每个质因子出现的次数,然后把幂 + 1 乘起来,而且特殊处理了出现次数等于模数的情况。
为什么这样子会乘除预期之外的 00 的答案呢?有点费解。
大家有没有遇到相同错误的。
CPP
#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
#define repp(i,a,b) for(int i=(a);i<(b);++i)
#define perr(i,a,b) for(int i=(a);i>(b);--i)
#define pb push_back
#define rz resize
#define fi first
#define se second

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
typedef long double ldb;

signed main() {

    if(fopen("yl.in", "r")) {
        freopen("yl.in", "r", stdin);
        freopen("yl.out", "w", stdout);
    }

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    vector<int> Prime(1e6 + 10), vp(1e6 + 10), minFac(1e6 + 10);
    int tot = 0;
    function<void(int)> seive = [&](int n) {
        vp[1] = 1;
        rep(i,2,n) {
            if(!vp[i]) { Prime[++ tot] = i; minFac[i] = i; }
            for(int j = 1; 1ll * i * Prime[j] <= n; ++ j) {
                vp[i * Prime[j]] = 1; minFac[i * Prime[j]] = Prime[j];
                if(i % Prime[j] == 0) break;
            }
        }
    };
    seive(1e6);

    int x, q, mod;
    cin >> x >> q >> mod;
    while(x % 2 == 0) x /= 2;
    map<int,int> mp;
    int ans = 1, cnt = 0;
    for(int i = 1; 1ll * Prime[i] * Prime[i] <= x; ++ i)
        if(x % Prime[i] == 0) {
            pair<int,int> tmp = {Prime[i], 0};
            while(x % Prime[i] == 0) {
                x /= Prime[i]; ++ tmp.second;
            }
            mp.insert(tmp);
            if(tmp.second + 1 == mod) ++ cnt;
            else ans = 1ll * ans * (tmp.second + 1) % mod;
        }
    if(x != 1) {
        mp.insert({x, 1});
        ans = 1ll * ans * 2 % mod;
    }

    function<int(int,int)> powmod = [&](int x, int y) {
        int ret = 1 % mod;
        for(; y; y >>= 1) {
            if(y & 1) ret = 1ll * ret * x % mod;
            x = 1ll * x * x % mod;
        }
        return ret;
    };
    int y;
    while(q --) {
        cin >> y;
        while(y % 2 == 0) y /= 2;
        while(y != 1) {
            pair<int,int> tmp = {minFac[y], 0};
            while(y % tmp.first == 0) {
                y /= tmp.first; ++ tmp.second;
            }
            auto it = mp.find(tmp.first);
            if(it == mp.end()) {
                mp.insert(tmp);
                if(tmp.second + 1 == mod) ++ cnt;
                else ans = 1ll * ans * (tmp.second + 1) % mod;
            }
            else {
                if(it -> second + 1 == mod) -- cnt;
                else ans = 1ll * ans * powmod(it -> second + 1, mod - 2) % mod;
                it -> second += tmp.second;
                if(it -> second + 1 == mod) ++ cnt;
                else ans = 1ll * ans * (it -> second + 1) % mod;
            }
        }
        if(cnt) cout << 0 << endl;
        else cout << ans << endl;
    }
    return 0;

}

回复

4 条回复,欢迎继续交流。

正在加载回复...