I, as a ACMer, always take algorithm complexity into consideration when programming. Today, I introduce you some elegant algorithms of root Complex.
转载请注明Reproduced please specifydna049.com
Since The range of ⌊ni⌋ contains at most 2n‾‾√ . There may exist a algorithm of complexity O(n‾‾√) .
LL getsum(LL n){ // The code is simple and easy to understand
LL sum = 0;
for(LL i=1,j;i<=n;i=j+1){
j = n/(n/i);
sum += (j-i+1)*(n/i);
}
return sum;
}
Actually, s(n) donate the number of positive integer point under graph xy=1 .
LL mypow(LL x,LL n){
LL r = 1;
while(n){
if(n&1) r=r*x;
n>>=1; x=x*x;
}
return r;
}
LL getr(LL n,LL k){
LL r = 0,d;
for(d=1;d*dif(n%d==0) r += mypow(d,k) + mypow(n/d,k);
}
if(d*d == n) r+=mypow(d,k);
return r;
}
The code above is primary and trival.
If we get ts[n]=∑ni=1ik , similar to problem 1, we have fllowing C++ code:
LL getf(LL n){
LL sum = 0;
for(LL i=1,j;i<=n;i=j+1){
j = n/(n/i);
sum += (ts[j]-ts[i-1])*(n/i);
}
return sum;
}
Actuall, we have
Throughout this blog, ϕ(n) donate the Euler function unless explicitly stated. ϕ(n) counts the positive integers less than or equal to n that are relatively prime to n. Euler’s product formula:
Now, we begin to computer g(n)
we define
and
const int N=1000006;
LL ans[N];
void init(){
memset(ans,-1,sizeof(ans));
ans[1]=1;ans[2]=2;
}
LL getans(int n){
if(n1) return ans[n];
LL r = n*(n+1)/2;
for(int i=2,j;i<=n;i=j+1){
j = n/(n/i);
r -= (j-i+1)*getans(n/i);
}
if(nreturn r;
}
If
Since
//#pragma comment(linker,"/STACK:10240000,10240000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair PLL;
#define clr(a,b) memset(a,b,sizeof(a))
#define MP make_pair
#define PB push_back
#define lrt rt<<1
#define rrt rt<<1|1
#define lson l,m,lrt
#define rson m+1,r,rrt
/*------------------------- template ------------------------------*/
const int N=1000006;
const int M = 1e9+7;
const int inv3 = (M+1)/3;
int ans[N];
map<int,int> mp;
void init(){
for(int i=0;i1)*(i-2)%M;
}
for(int i=1;i// Pretreatment acceleration
for(int j=i<<1;jif(ans[j] < 0) ans[j] += M;
}
}
for(int i=2;i1];
if(ans[i] > M) ans[i] -= M;
}
}
int getans(int n){
if(nreturn ans[n];
map<int,int>::iterator it = mp.find(n); //Memory search
if (it != mp.end()) return it->second;
int r = LL(n)*(n-1)%M*(n-2)%M*inv3%M;
for(int i=2,j;i<=n;i=j+1){
j = n/(n/i);
r -= LL(j-i+1)*getans(n/i)%M;
if(r<0) r+=M;
}
mp.insert(pair<int,int>(n,r));
return r;
}
int main(){
// freopen("/Users/c10110057/Desktop/AC/in","r",stdin);
init();
int T,n;
cin>>T;
while(T--){
scanf("%d",&n);
cout<return 0;
}
All C++ code above should be changed to fit different demands.Thanks Zimpha who provides some problems and ideas two years old.