1151_DIV 2: C. 나 자 르 에 대한 문제 (수학)
17319 단어 데이터 구조 와 알고리즘알고리즘ACM
방법: 사실은 수학 시 뮬 레이 션 문제 입 니 다. 분명히 답 은 접두사 와 성질 을 만족 시 킵 니 다. 우 리 는 solve (r) - solve (l - 1) 로 답 을 얻 을 수 있 습 니 다.어떻게 solve (x) 를 풀 수 있 습 니까?제목 의 뜻 에 따라 배가 하면 된다. 집합 에서 연속 적 인 홀수 블록 과 연속 적 인 짝수 블록 으로 구성 되 기 때문에 블록의 길 이 는 2 의 幂 次 이다. 우 리 는 홀수 블록 과 짝수 블록 을 분리 하여 인접 한 홀수 블록 이나 짝수 블록의 길이 가 4 배의 차 이 를 발견 할 수 있다.우 리 는 첫 번 째 조각 부터 옮 겨 다 니 기 시 작 했 는데, 몇 번 째 조각의 총 길이 가 x 를 초과 할 수 있 는 것 을 본 후에 화 해 를 구하 면 된다.화 해 를 구하 면 모든 블록 이 연속 적 인 등차 수열 이기 때문에 이 블록의 첫 번 째 항목 이 얼마 인지 계산 한 다음 에 블록의 길이 와 첫 번 째 항목 의 값 에 따라 공식 O (1) 를 이용 하여 계산 할 수 있 고 마지막 블록 (마지막 블록 이 전부 포함 되 지 않 았 기 때문에) 을 특수 하 게 계산 할 수 있 습 니 다. 여 기 는 여러 가지 모델 링 을 주의해 야 합 니 다. 그렇지 않 으 면 넘 쳐 서 모델 링 을 할 수 있 는 곳 에서 모두 모델 링 을 해 야 합 니 다.복잡 도 log (n)
코드:
#include
using namespace std;
const long long mod = 1e9 + 7;
long long l,r;
long long fpow(long long a,long long b) {
long long res = 1;
while(b) {
if(b & 1) res = res * a;
a = a * a;
b >>= 1;
}
return res;
}
long long solve(long long l) {
long long odd = 0,even = 0; // / ,
long long cnt = 0,i; //cnt ,i
long long ans = 0; //
for(i = 1,cnt = 1,even = 0,odd = 0; i <= l; i += i,cnt++){
if(cnt % 2 == 0) {
long long tmp = 2 * (fpow(4,even) - 1) / 3;
//a1 = 2 + 2 * tmp;
ans = ((ans + ((2 + 2 * tmp) % mod) * (i % mod)) % mod + ((i - 1) % mod * (i % mod)) % mod ) % mod;
even++;
}
else {
long long tmp = 1 * (fpow(4,odd) - 1) / 3;
//a1 = 1 + (tmp) * 2
ans = ((ans + ((1 + 2 * tmp) % mod) * (i % mod)) % mod + ((i - 1) % mod * (i % mod)) % mod) % mod;
odd++;
}
l -= i;
}
if(l) {
if(cnt % 2 == 0) {
long long tmp = 2 * (fpow(4,even) - 1) / 3;
//a1 = 2 + 2 * tmp;
ans = ((ans + ((2 + 2 * tmp) % mod) * (l % mod)) % mod + ((l - 1) % mod * (l % mod)) % mod ) % mod;
even++;
}
else {
long long tmp = 1 * (fpow(4,odd) - 1) / 3;
//a1 = 1 + (tmp) * 2
ans = ((ans + ((1 + 2 * tmp) % mod) * (l % mod)) % mod + ((l - 1) % mod * (l % mod)) % mod ) % mod;
odd++;
}
}
return ans % mod;
}
int main() {
scanf("%lld%lld",&l,&r);
printf("%lld
",(solve(r) + mod - solve(l - 1)) % mod);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JAVA] 배열 회전 출력요소 가 출력 을 시작 하 는 위치 에 주의 하 십시오. 모두 몇 라운드 의 수출 이 있 습 니까? n/2 + 1 매 라 운 드 는 상, 우, 하, 좌 로 나 뉜 다. 각 방향의 시작 위치 와 좌표 의 관 계 를 구...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.