모 비 우 스 알고리즘 에 대한 분석
9938 단어 수론몽 신 OI 성장 경험
Given 5 integers: a, b, c, d, k, you’re to find x in a…b, y in c…d that GCD(x, y) = k. GCD(x, y) means the greatest common divisor of x and y. Since the number of choices may be very large, you’re only required to output the total number of different number pairs.
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.
Yoiu can assume that a = c = 1 in all test cases.
【Input】 The input consists of several test cases. The first line of the input is the number of the cases. There are no more than 3,000 cases. Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
【Output】 For each test case, print the number of choices. Use the format in the example.
【Sample Input】 2 1 3 1 5 1 1 11014 1 14409 9
【Sample Output】 Case 1: 9 Case 2: 736427
【Hint】 For the first sample input, all the 9 pairs of numbers are (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 5), (3, 4), (3, 5).
, ...... , 。
그래, 본론 으로 돌아 가자. 최근 에 모 비 우 스 의 재연 (그래, 선생님 이 시 킨 거 야) 을 보고 재 미 있 었 다. (그래, 선생님 이 시 킨 거 야) 그래서 인정 (zao) 진 (xi) 진 (you) 의 공 부 를 시작 했다.내 영어 실력 을 보 여줄 때 가 온 것 같 아.진실 은 하나 야 -
제 시 된 n 개 질문 에 대해 매번 몇 개의 수 대 (x, y) 를 구 할 때마다 a ≤ x ≤ b, c ≤ y ≤ d 를 만족 시 키 고 gcd (x, y) = k, gcd (x, y) 함 수 는 x 와 y 의 최대 공약수 이다.100% 데이터 에 대해 a = c = 1.
이 주 제 를 다 배 운 후에 나 는 학업 에 있어 서 또 (shi) 진 (fen) 일 (tong) 보 (ku) 라 고 생각한다.나 는 이제 더 이상 말 하고 싶 지 않다. 모 비 우 스 의 재연 을 소개 해 보 자.
멍 한 텅스텐 필라멘트 리 액 션 은... 아 닙 니 다. 모 비 우 스 리 액 션 은 쉽게 말 하면 공식 입 니 다. 이 공식 으로 이미 알 고 있 는 함 수 를 통 해 이 함수 와 관련 된 또 다른 함수 의 값 을 유도 할 수 있 습 니 다.좀 꼬 인 것 같은 데??괜찮아, 프로그래머 는 이런 세부 사항 에 신경 쓸 필요 가 없어.여기 서 는 간략하게 말 할 뿐이다.그것 이 가 져 온 수론 연산 을 간소화 하 는 효 과 는 다른 알고리즘 과 비교 하기 어렵다.
공식 은 다음 과 같다. G (n) = sigma (F (d)) (그 중에서 d | n) (집합 포함) 는 사실 재연 에 또 다른 집합 공식 이 있다. 그러나 그것 은... 폐 기 된 것 이 고 ACM 이 나타 나 지 않 았 기 때문에 이것 을 먼저 배 웠 다.이 공식 을 통 해 우 리 는 F 와 G 의 관 계 를 알 수 있다. G (1) = F (1) G (2) = F (1) + F (2) G (3) = F (1) + F (3) G (6) = F (1) + F (2) + F (3) + F (6) 다음은 용 척 원리 이다. G 로 F 의 값 을 표현 할 때 그 를 사용 하기 때문이다.그래서 각 식 앞의 G 는 하나의 계수 (- G 와 G, 아 참, 그리고 0 * G, 즉 나타 나 지 않 음) 가 있 습 니 다. 그리고 우 리 는 오로라 함 수 를 통 해 F (n) 를 구 할 때 G (d) 의 계 수 를 얻 습 니 다.그러면 남 은 문 제 는 G 의 계수!!!우 리 는 구 해 F (6) 를 예 로 들 어 설명 하고 하나의 계수 함수 H (d, n) 를 정의 한다. 그 중 H (d, n) 가 구 해 F (n) 를 표시 할 때 G (d) 의 계수 (그 중 d | n) 를 얻 을 수 있 기 때문에 이 식 의 F (6) = H (6, 6) * G (6) + H (2, 6) * G (2) + H (3, 6) G (3) + H (3) G (3) + H (1, 6) G (1) 를 얻 을 수 있다. 우 리 는 a, b, c, d 로 각각 4 개의 H (6, 6), H (2, 6), H (2, 6), H (3, 6), H (3, 6), H (3, 6) G (3) + H (3) + 의 G 를 F 로 표시 하고,F (6) = a * (F (6) + F (3) + F (2) + F (2) + F (1) + b * (F (2) + F (1) + c * (F (3) + c * (F (3) + F (1) + d * F (1) 다시 변형 시 켜 F (6) * (a - 1) + F (3) * (a + c) + F (2) + F (2) * (a + c) + F (2) * (a + b) + F (1) + F (1) * (a + b + b + c + c + c + c (1) * (1) * (a + b + c + c + c + c + c + c + c + c + c + c + d) = 0 = 0, F (6) = 0, F (6) 방정식 팀!!a-1==0 a+c==0 a+b==0 a+b+c+d==0
이렇게 하면 항상 해 를 찾 을 수 있 으 니, 나 에 게 왜 냐 고 묻 지 마라, 그 무슨 방정식 인지 알 겠 니?
그러면 결론 을 하나 더 내 면 계산 과정 이 복잡 하지 않다 는 것 을 스스로 증명 할 수 있다.H (a, b) 는 모두 H (1, b / a) 라 고 쓸 수 있 습 니 다. 그래서 우 리 는 H 의 첫 번 째 요 소 를 생략 하고 H (x) 라 고 간략하게 말 하면 H 와 U 를 연결 시 킬 수 있 습 니 다. 사실은 U (x) = H (x) = H (1, x) 를 다시 하면 우 리 는 U (x) 에 더욱 구체 적 인 의 미 를 부여 할 수 있 습 니 다. U (x) 는 F (x) 를 계산 할 때 G (1) 의 계 수 를 표시 합 니 다!(U (x) = = H (1, x) 때문에)
다음은 위 에 있 는 U (x) 의 새로운 의미 로 U (x) 의 값 을 계산 하 는 방법 을 시도 해 보 겠 습 니 다!!일단 확실하게 2 점!하 나 는 G (x) 에 F (1) 가 포함 되 어 있 습 니 다. 1 | x 2 는 F (1) = G (1) 이기 때 문 입 니 다.
(0). 만약 x = = 1 이 F (1) = G (1) 때문에 U [1] = 1;
(1). 만약 에 x 가 하나의 질 수 F (x) = U (1) G (x) + U (x) G (1) 를 U (1) = 1 로 가 져 간다 고 가정 하면 G (x) 에 F (1) 가 하나 있 고 왼쪽 에 F (1) 가 없 기 때문에 우 리 는 G (1) 를 이용 하여 F (1) 를 없 애 야 하기 때문에 U (x) = - 1 을 얻 을 수 있다.
(2). x 가 2 개의 서로 다른 질수 의 곱 하기 x = p * q 로 쓸 수 있다 고 가정 하면 F (x) = U (1) * G (pq) + U (q) * G (p) + U (p) * G (q) + U (x) * G (1) 여기 U (1), U (p), U (q) 는 앞의 2 가지 상황 대 입 계수 이다. 왼쪽 에 F (1) 가 없 기 때문에 오른쪽 F (1) 를 상쇄 하기 위해 우 리 는 U (x) = 1 이 필요 하 다.
(3). 만약 x 가 3 개의 서로 다른 질의 곱 하기 x = p * p1 * p2 로 쓸 수 있다 고 가정 하면 우 리 는 z = p1 * p2 F (x) = U (1) * G (pz) + U (z) * G (p) + U (p) G (z) + U (x) G (1);그 중에서 U (1), U (p), U (z) 는 각각 앞의 몇 가지 상황 으로 가 져 온 후에 F (1) 를 상쇄 하기 위해 U (x) = - 1 을 얻 으 면 똑 같은 방식 으로 아래로 전달 할 수 있 고 첫 번 째 결론 을 얻 을 수 있 습 니 다. 만약 에 x = p1 * p2... * pr, 그 중에서 pi 가 서로 다른 질 수 라면 U [x] = (- 1) ^ r - - - - - 1!!
(4). 만약 x 가 하나의 질 수의 제곱 x = p ^ 2 F (x) = U (1) * G (x) + U (p) * G (p) + U (x) * G (1) 대 입 계 수 를 U (x) = 0 으로 쓸 수 있다 고 가정 합 니 다.
(5). 만약 x 가 하나의 질수 로 쓸 수 있 는 3 차원 x = p ^ 3 F (x) = U (1) * G (x) + U (p) * G (p ^ 2) + U (p ^ 2) * G (p) + U (x) * G (1) 가 계수 에 들 어간 후 U (x) = 0;이 를 통 해 같은 방식 으로 아래로 전달 하여 두 번 째 결론 을 얻 을 수 있 습 니 다. 만약 x = p ^ e (e > 1) U [x] = 0; - - –2!!
(6). x 를 x = p ^ e * q 로 쓸 수 있다 고 가정 하면 p, q 는 서로 다른 질 수 입 니 다. e > 1 F (x) = U (1) * G (x) + U (q) * G (p ^ e) + U (p ^ e) * G (q) + U (x) * G (1) 대 입 계수 후 U (x) = 0;
이 를 통 해 계속 아래로 밀 어 붙 여 제2 조 결론 을 얻 을 수 있 는 강화 판!!만약 x = p ^ e * z 중 p 가 질 수 이 고 z 가 임 의 수 라면 e > 1 그러면 U [x] = 0
거의 다 르 지 않다.
끝 난 줄 알았어?코드 소개 할 까요?헤헤, 자, 너 를 계속 괴 롭 히 는 이 문 제 를 어떻게 풀 것 인 가 를 먼저 말 해 봐.이 문 제 는 비교적 징 그 러 운 점 이 있 는데 데 이 터 는 k = = 0 이 있 는데 이때 분명히 답 은 0 이 고 두 개의 숫자 가 없 는 gcd 는 0 이다.우선 gcd 는 소 용이 없습니다.gcd 를 약속 한 후 두 개의 수치 가 서로 질 적 이기 때문이다.그래서 우 리 는 x / = k y / = k 를 가설 하고 x < = y 를 가설 한 다음 에 문 제 는 구간 [1. x] 과 [1. y] 중의 상호 질량 수가 몇 쌍 인지 2 개의 수로 바 뀌 었 다.이 문 제 는 1 - 3 과 3 - 1 의 경우 한 가지 로 계산 해 야 하기 때문에 x 만 제한 하면 된다.
#include
#include
#include
#include using namespace std; const int maxn=1000000; bool check[maxn+10]; // int prime[maxn+10]; // int U[maxn+10];// void get_Mobius() {
memset(check,0,sizeof(check));
U[1]=1;
int tot=0;
for(int i=2;i<=maxn;i++)
{
if(check[i]==0)
{
prime[tot++]=i;
U[i]=-1;// ,1
}
for(int j=0;jif(i*prime[j]>maxn)break;
check[i*prime[j]]=true;
if(i%prime[j]==0)
{
U[i*prime[j]]=0;//
break;
}
else
{
U[i*prime[j]]=-U[i];// ,
}
}
} } /* F(t)= gcd(x,y)%t==0 f(t)= gcd(x,y)=t , F(t) f(t) 。 F(t)=(b/t)*(d/t) gcd(x,y)=1, gcd(x?k,y?k)=k, b d k, f(1) 。 lim=min(b/k,d/k), ,
*/ int main() {;
int T;
int a,b,c,d,k;
get_Mobius();
scanf("%d",&T);
for(int ii=1;ii<=T;ii++)
{
scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
if(k==0)
{
printf("0
");
continue;
}
b/=k;a/=k;
d/=k;c/=k;
if(b>d)swap(b,d);
long long ans1=0;
for(int i=1;i<=b;i++)
ans1+=(long long)U[i]*(b/i)*(d/i);// G(n) F(1) = sigma(U[i]*(a/i)*(b/i)) (1<=i<=N)
long long ans2=0;
for(int i=1;i<=b;i++)
ans2+=(long long)U[i]*(b/i)*(b/i);//
ans1-=ans2/2;
printf("%lld
",ans1);
}
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에 따라 라이센스가 부여됩니다.