hdu 4961 Boring Sum

제목 링크: 클릭 하여 링크 열기
제목 의 뜻 을 잘 이해 합 니 다. 실제로 바 꾸 면 b [i] 는 a [i] 앞의 첫 번 째 배수 입 니 다. 없 으 면 a [i], c [i] 는 a [i] 뒤의 첫 번 째 배수 입 니 다.
이렇게 하면 1 부터 100000 까지 모든 수의 약 수 를 미리 처리 하여 p [] 에 저장 하고 k [] 로 1 부터 100000 까지 각 수의 밀 착 배 수 를 표시 합 니 다.먼저 앞 뒤로 쓸 어 버 리 고 각 수의 약수 에 따라 k [] 를 업데이트 하고 b [] 를 얻 은 다음 에 뒤에서 c [] 를 얻 습 니 다.
코드:
#include <cstdio>
#include <iostream>
#include <vector>
#define MAX 100010
#include <cstring>
using namespace std;

int a[MAX];
int b[MAX];
int c[MAX];
int k[MAX];
bool vis[MAX];

vector <int > p[MAX];
int main(){
    int n;
    for(int i=1;i<=100000;i++){
        for(int j=i;j<=100000;j+=i){
            p[j].push_back(i);
        }
    }
    while(~scanf("%d",&n),n){
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int  i=1;i<=n;i++){
            if(!vis[a[i]]) b[i]=a[i];
            else b[i]=k[a[i]];
            for(int j=0;j<p[a[i]].size();j++){
                k[p[a[i]][j]]=a[i];
                vis[p[a[i]][j]]=1;
            }
        }
        memset(vis,0,sizeof(vis));
        for(int  i=n;i>=1;i--){
            if(!vis[a[i]]) c[i]=a[i];
            else c[i]=k[a[i]];
            for(int j=0;j<p[a[i]].size();j++){
                k[p[a[i]][j]]=a[i];
                vis[p[a[i]][j]]=1;
            }
        }
        long long res=0;
        for(int i=1;i<=n;i++){
            res+=(long long)b[i]*(long long)c[i];
        }
        printf("%I64d
",res); } return 0; }

좋은 웹페이지 즐겨찾기