码迷,mamicode.com
首页 > 其他好文 > 详细

CodeChef Chef and Functions

时间:2018-01-24 15:28:21      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:color   main   vector   std   long   stat   target   turn   codechef   

题链

脑洞题,我们发现要算的最多60位,后面一定是1.

随手打了这样的暴力,以为能A,结果T,查了下,pow,exp,log,用的是泰勒展开一直以为是表

那么预处理加二分

#pragma GCC optimzie("-O2")
#include<bits/stdc++.h>
#define sight(x) (‘0‘<=x&&x<=‘9‘)
#define mo 1000000007
#define LL long long
#define pb push_back
#define AA assert
#define MM 1000000000010000000LL
//#define int LL
inline void read(int &x){
    static int b;static char c;
    for(b=1,c=getchar();!sight(c);c=getchar()) if (c==-) b=-1;
    for(x=0;sight(c);c=getchar()) x=x*10+c-48; x*=b;
}
inline void read(LL &x){
    static int b;static char c;
    for(b=1,c=getchar();!sight(c);c=getchar()) if (c==-) b=-1;
    for(x=0;sight(c);c=getchar()) x=x*10+c-48; x*=b;
}
void write(int x){if (x<10) {putchar(48+x);return;} write(x/10),putchar(48+x%10);} 
inline void writeln(int x){if (x<0) putchar(-),x*=-1;write(x);putchar( );}
using namespace std;
LL Mo(LL x){if (x>=mo) x%=mo; if (x<0) (x%=mo)+=mo; return x;}
int a[15007],q,T,n;
LL XX,ans,x,RT;
vector<LL> pw[107],pww[107];
void precal(){
    LL i,j;int p;
    for(i = 3;i<100;i++){
        pw[i].pb(1);pww[i].pb(1);
    }
    for(i = 1;i<=1000000;i++){
        for(j = i*i*i,p = 3;p<100;j*=i,p++){
            pw[p].pb(j);
            pww[p].pb(i);
            if(j>=MM/i) break;
        }
    }
}
LL calc(int i,LL x){
    if(i == 1) return x;
    if(i == 2) return (LL)sqrtl(x);
    assert(i<=70);
    if(pw[i].size() == 0) return 1;
    int lo = 0, hi = pw[i].size() - 1;
    int mid, ret = 0;
    while(lo<=hi){
        mid = (lo + hi) >>1;
        LL a = pw[i][mid];  
        if(a>x) hi = mid - 1;
        else lo = mid + 1,ret = mid;
    }
    return pww[i][ret];
}
signed main () {    
    precal(); read(T);
    while (T--) {
        read(n); XX=0; read(q);
        for(int i=1;i<=n;i++) {
         read(a[i]);if (a[i]<0) a[i]+=mo;}
        for(int i=n;i>60;i--) XX=Mo(XX+a[i]); n=min(60,n);
        while (q--) { read(x); ans=0;
         for(int i=1;i<=n;i++) 
           ans=Mo(ans+(calc(i,x)%mo)*(LL)a[i]%mo);
          ans=Mo(ans+XX);
          AA(0<=ans&&ans<mo); writeln(ans);
        }
    } return 0;
}

 

CodeChef Chef and Functions

标签:color   main   vector   std   long   stat   target   turn   codechef   

原文地址:https://www.cnblogs.com/rrsb/p/8341305.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!