社区讨论
这个题 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 如下:
我写的是用 map 维护一下每个质因子出现的次数,然后把幂 + 1 乘起来,而且特殊处理了出现次数等于模数的情况。
为什么这样子会乘除预期之外的 的答案呢?有点费解。
大家有没有遇到相同错误的。
CPPcheck commit 如下:
wrong answer 7660th numbers differ - expected: '631', found: '0'我写的是用 map 维护一下每个质因子出现的次数,然后把幂 + 1 乘起来,而且特殊处理了出现次数等于模数的情况。
为什么这样子会乘除预期之外的 的答案呢?有点费解。
大家有没有遇到相同错误的。
#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 条回复,欢迎继续交流。
正在加载回复...