BZOJ 3884 하느님 과 집합의 정확 한 용법
3865 단어 수론
제목: 222... modp 의 값, 여러 그룹 문의.p≤107 .
문제 풀이: 오로라 의 정 리 를 고려 하여 (a, p) = 1 시, aϕ(p)≡1(modp) . 이 를 통 해 x ≥ 라 는 결론 을 쉽게 얻 을 수 있다.ϕ있다
ax≡axmodϕ(p)+ϕ(p)(modp)
증명 과정 과 큰 걸음 작은 걸음 알고리즘 을 확장 하 는 소 인자 과정 이 유사 하 므 로 번 거 로 움 을 느끼 지 않 고 참고 할 수 있 습 니 다.
AekdyCoin
의 글 [A ^ x = A ^ (x% Phi (C) + Phi (C))) (mod C) 에 대한 약간의 증명] [지수 순환 절]이 문제 로 돌아 가 f (p) = 222... modp 라면 f (1) = 0.또 무한 식 이기 때문에 222... 의 지 수 는 원래 초과 합 니 다.ϕ(p) 의, 그래서 우 리 는 고 칠 수 있다.
f(p)=2(22...modϕ(p))+ϕ(p)modp=2f(ϕ(p))+ϕ(p)modp
그래서 얻 었 다.
f (p) 의 전달 식.
이렇게 계산 하 는 것 은 O (p) 인 것 같 지만, 우 리 는 맞 출 수 있다.ϕ(ϕ(...ϕ(p))) 분석: p 가 짝수 라면ϕ(p)≤p2 ; p 가 홀수 라면 p 에 홀수 인자 q 가 존재 합 니 다.ϕ(p) 짝수 인자 (q - 1) 가 존재 하여 짝수 로 바 뀌 는 경우.이로부터 알 수 있 듯 이ϕ(ϕ(...ϕ(p))) 의 계산 은 O (logp) 차 의 교 체 를 거 쳐 1 에 이 르 렀 기 때문에 f (p) 의 계산 은 O (p √ logp) 의 것 이다.
출제 자가 내 놓 은 해법 도 O (p √ logp) 이 니 관심 있 는 것 은 가 봐 도 무방 하 다.
코드:
#include <map>
#include <cstdio>
using namespace std;
map<int, int> f;
int pow(int x, int k, int p)
{
int ret = 1;
while(k)
{
if(k & 1)
ret = (long long)ret * x % p;
x = (long long)x * x % p;
k >>= 1;
}
return ret;
}
int phi(int x)
{
int ret = x;
for(int i = 2; i * i <= x; ++i)
if(x % i == 0)
{
ret -= ret / i;
while(x % i == 0)
x /= i;
}
if(x > 1)
ret -= ret / x;
return ret;
}
int F(int x)
{
if(f.count(x))
return f[x];
int p = phi(x);
return f[x] = pow(2, F(p) + p, x);
}
int main()
{
int t, n;
scanf("%d", &t);
f[1] = 0;
while(t--)
{
scanf("%d", &n);
printf("%d
", F(n));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU 5608] functionProblem Description There is a function f(x),which is defined on the natural numbers set N,satisfies the following eqaut...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.