Codeforces Round \ # 191 (Div. 2) C. Magic Five 등비 수열 의 빠 른 속도

1856 단어 알고리즘
제목 링크
이 문 제 는 POJ 3233 의 기본 적 인 사고방식 과 같다.
이 문 제 는 빠 른 멱 으로 구 해 야 한다. 만약 에 항수 가 많은 등비 수열 이 있다 면 구 와 공식 에 나 누 기 번 호 를 포함 해 야 하기 때문에 직접 mod 를 취 할 수 없고 빠 른 쌀 의 전환 을 해 야 한다.
예 를 들 어 sum = 2 ^ 1 + 2 ^ 2 + 2 ^ 3 + 2 ^ 4 + 2 ^ 5 + 2 ^ 6 + 2 ^ 7.....
모두 n 항 이 있다
이것 은 공식 입 니 다. 약 n% 2 = = 0 입 니 다.    T(n)=T(n/2)+T(n/2)*2^(n/2);
                            만약 n% 2 = = = 1    T(n)=T(n/2)+T(n/2)*2^(n/2)+ 2^n;
이 문제 에 있어 서 먼저 주어진 순환 위치 상의 것 과 구 조 를 바탕 으로 한 다음 에 빠 른 속도 위의 공식 을 이용 하여 연결 하면 된다.
여기 서 나 는 시합 이 끝 난 후에 야 이 문 제 를 여러 번 고 쳤 다. 특히 주의해 야 한다int 64 연산 에 저 장 됩 니 다.
아래 에 제 코드 를 붙 여 주세요.
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
const __int64 mod=1000000007;
__int64 all;
int Pow(__int64 n,int num){     //    num^n
    if(n==0)return 1;
    if(n==1)return num;
    __int64 tmp=Pow(n/2,num)%mod;
    tmp=tmp*tmp%mod;
    if(n%2==1)tmp=tmp*num%mod;
    return (int)tmp;    
}
__int64 len;
int q; 
int fun(int n){              //         
    if(n==1)return all;
    __int64 tmp=fun(n/2);
    tmp=(tmp+tmp*Pow(n/2,q))%mod;
    if(n%2==1)tmp=( tmp+Pow((n-1)*len,2)*all%mod )%mod;
    return (int)tmp;

}

char a[2000000];
int main()
{
    int n,ans;
    while(scanf("%s",a)!=EOF){
        cin>>n;
        ans=0;
        len=strlen(a);
        q=Pow(len,2)%mod;
        all=0;
        for(int i=0;i<len;i++){
            if(a[i]=='0'||a[i]=='5'){
               all=(all+Pow(i,2))%mod;
            } 
            //cout<<i<<" "<<ans<<endl;      
        }
        //cout<<"all="<<all<<endl;
        ans=fun(n);
        cout<<ans<<endl;
    }
    return 0;    
} 

좋은 웹페이지 즐겨찾기