Submission #33867609
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
#define rep(i,a,n) for (ll i=a;i<(ll)n;i++)
#define per(i,a,n) for (ll i=n;i-->(ll)a;)
#define pb push_back
ll read(){ll r;scanf("%lld",&r);return r;} // read
ll quick_p(ll b, ll p,ll mod){
ll r = 1;
while(p){
if(p%2)(r*=b)%=mod;
(b*=b)%=mod;
assert(r>0);
assert(b>0);
p/=2;
}
return r%mod;
}
bool is_prime_32(ll v){
if(v == 2)return true;
if(v < 2)return false;
if(v%2 == 0)return false;
ll test_g[] = {2, 325, 9375, 28178, 450775, 9780504, 1795265022};
ll startp = v-1;
while(startp%2 == 0)startp>>=1;
rep(i,0,7){
ll p = startp;
ll base = test_g[i];
// don't break may cause 4033 bug
if(base % v == 0)continue;
bool find = false;
ll r = quick_p(base,p,v);
while(p != v-1){
if(r == v-1){
find = true;
break;
}
// -1 开始的序列, 或全1序列
if(r == 1){
if(p == startp){
find = true;
break;
}
return false;
}
p*=2;
(r*=r)%=v;
}
if(!find){
return false;
}
}
return true;
}
ll my_sqrt(ll v){
assert(v > 1);
ll l = 1;
ll r = v; // care overflow
ll ret = 1;
while(l < r){
ll m = (l+r)/2;
ll m2 = m*m;
if(m2 == v) return m;
if(m2 < v) {
ret = m;
l = m + 1;
} else {
r = m - 1;
}
}
return ret;
}
ll randint(ll low,ll hi){
return low + (rand() % static_cast<int>(hi - low + 1));
}
ll Pollard_Rho(ll N) { // 返回一个> 1的因数
assert(N > 1);
if (N == 4) return 2;
ll ret = my_sqrt(N); // 质数平方 效率低 提前判断
if(ret * ret == N) return ret;
while(true) {
ll c = randint(1, N - 1); // 生成随机的c
auto f = [=](ll x) { return ((lll)x * x + c) % N; }; // ll 表示__int128,防溢出
ll t = 0, r = 0; // 初始两个相同
do{
t = f(t); // 1倍速度
r = f(f(r)); // 2倍速度
ll d = gcd(abs(t - r), N);
if (d > 1 && d < N) return d;
}while (t != r);
}
}
// 分解x为质因数, sorted, {prime,power}
vector<pair<ll,int> > fenjie(ll x) {
vector<int> res = {};
deque <ll> arr = {x};
while(arr.size()){
ll v = arr.front();
arr.pop_front();
if(v == 1) continue;
if(is_prime_32(v)) {
res.pb(v);
continue;
}
ll divisor = Pollard_Rho(v);
arr.push_back(divisor);
arr.push_back(v/divisor);
}
sort(res.begin(),res.end());
vector<pair<ll,int> > ret;
rep(i,0,res.size()){
if(i == 0|| res[i] != res[i-1]) ret.push_back({res[i], 1});
else ret.back().second++;
}
return ret;
}
ll phi(ll n){
auto primes = fenjie(n);
// printf("%lld =",n);
// for(auto [v,pwr]:primes) printf("[%lld %d]",v,pwr);
// printf("\n");
ll ret = n;
for(auto [v,pwr]:primes) ret = (ret/v)*(v-1);
return ret;
}
// ------ lib ------
int n ;
// test pwr 10^p = k 9v + 1, 10^p % 9v == 1
bool testPwr(ll p){
return quick_p(10, p, 9 * n) == 1;
}
void dfs(int idx, vector<pair<ll,int>> primes, ll mul, ll & ans){
if(idx == (int)primes.size()){
if(testPwr(mul)) ans = min(ans,mul);
return ;
}
rep(pwr,0,primes[idx].second+1){
dfs(idx+1,primes,mul,ans);
mul *= primes[idx].first;
}
}
void w(){
n = read();
if(n % 4 == 0 || n % 5 == 0){
printf("-1\n");
return ;
}
if(n % 2 == 0) n /= 2;
ll phin = n % 3 == 0 ? phi(9*n) : phi(n);
if(phin == 1){
printf("1\n");
return ;
}
// printf("test %lld: %d\n",phin,(int)testPwr(phin,n));
auto primes = fenjie(phin);
ll ans = phin;
dfs(0, primes, 1, ans);
printf("%lld\n",ans);
}
int main(){
int t = read();
while(t--) w();
return 0;
}
Submission Info
| Submission Time |
|
| Task |
G - 222 |
| User |
cromarmot |
| Language |
C++ (GCC 9.2.1) |
| Score |
600 |
| Code Size |
3717 Byte |
| Status |
AC |
| Exec Time |
16 ms |
| Memory |
3768 KiB |
Compile Error
./Main.cpp: In function ‘ll read()’:
./Main.cpp:10:21: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
10 | ll read(){ll r;scanf("%lld",&r);return r;} // read
| ~~~~~^~~~~~~~~~~
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
sample_01.txt |
| All |
hand_01.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, random_17.txt, random_18.txt, random_19.txt, random_20.txt, random_21.txt, random_22.txt, random_23.txt, sample_01.txt |
| Case Name |
Status |
Exec Time |
Memory |
| hand_01.txt |
AC |
9 ms |
3636 KiB |
| random_01.txt |
AC |
15 ms |
3640 KiB |
| random_02.txt |
AC |
7 ms |
3584 KiB |
| random_03.txt |
AC |
13 ms |
3672 KiB |
| random_04.txt |
AC |
11 ms |
3764 KiB |
| random_05.txt |
AC |
11 ms |
3712 KiB |
| random_06.txt |
AC |
6 ms |
3612 KiB |
| random_07.txt |
AC |
12 ms |
3712 KiB |
| random_08.txt |
AC |
10 ms |
3676 KiB |
| random_09.txt |
AC |
11 ms |
3632 KiB |
| random_10.txt |
AC |
11 ms |
3768 KiB |
| random_11.txt |
AC |
16 ms |
3740 KiB |
| random_12.txt |
AC |
13 ms |
3668 KiB |
| random_13.txt |
AC |
15 ms |
3680 KiB |
| random_14.txt |
AC |
11 ms |
3584 KiB |
| random_15.txt |
AC |
12 ms |
3668 KiB |
| random_16.txt |
AC |
11 ms |
3588 KiB |
| random_17.txt |
AC |
12 ms |
3724 KiB |
| random_18.txt |
AC |
13 ms |
3712 KiB |
| random_19.txt |
AC |
15 ms |
3712 KiB |
| random_20.txt |
AC |
8 ms |
3668 KiB |
| random_21.txt |
AC |
12 ms |
3764 KiB |
| random_22.txt |
AC |
10 ms |
3740 KiB |
| random_23.txt |
AC |
6 ms |
3712 KiB |
| sample_01.txt |
AC |
2 ms |
3584 KiB |