結果
| 問題 |
No.888 約数の総和
|
| コンテスト | |
| ユーザー |
LayCurse
|
| 提出日時 | 2019-09-21 11:49:19 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 3 ms / 2,000 ms |
| コード長 | 3,008 bytes |
| コンパイル時間 | 2,577 ms |
| コンパイル使用メモリ | 210,788 KB |
| 最終ジャッジ日時 | 2025-01-07 18:55:16 |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void *wmem;
char memarr[96000000];
template<class T> inline void walloc1d(T **arr, int x, void **mem = &wmem){
static int skip[16] = {0, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
(*mem) = (void*)( ((char*)(*mem)) + skip[((unsigned long long)(*mem)) & 15] );
(*arr)=(T*)(*mem);
(*mem)=((*arr)+x);
}
inline void rd(long long &x){
int k;
int m=0;
x=0;
for(;;){
k = getchar_unlocked();
if(k=='-'){
m=1;
break;
}
if('0'<=k&&k<='9'){
x=k-'0';
break;
}
}
for(;;){
k = getchar_unlocked();
if(k<'0'||k>'9'){
break;
}
x=x*10+k-'0';
}
if(m){
x=-x;
}
}
inline void wt_L(char a){
putchar_unlocked(a);
}
inline void wt_L(int x){
int s=0;
int m=0;
char f[10];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
putchar_unlocked('-');
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(unsigned x){
int s=0;
char f[10];
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(long long x){
int s=0;
int m=0;
char f[20];
if(x<0){
m=1;
x=-x;
}
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
if(m){
putchar_unlocked('-');
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(unsigned long long x){
int s=0;
char f[21];
while(x){
f[s++]=x%10;
x/=10;
}
if(!s){
f[s++]=0;
}
while(s--){
putchar_unlocked(f[s]+'0');
}
}
inline void wt_L(double x){
printf("%.15f",x);
}
inline void wt_L(const char c[]){
int i=0;
for(i=0;c[i]!='\0';i++){
putchar_unlocked(c[i]);
}
}
inline void wt_L(string &x){
int i=0;
for(i=0;x[i]!='\0';i++){
putchar_unlocked(x[i]);
}
}
template<class T> int Factor_L(T N, T fac[], int fs[]){
T i;
int sz = 0;
if(N%2==0){
fac[sz] = 2;
fs[sz] = 1;
N /= 2;
while(N%2==0){
N /= 2;
fs[sz]++;
}
sz++;
}
for(i=3;i*i<=N;i+=2){
if(N%i==0){
fac[sz] = i;
fs[sz] = 1;
N /= i;
while(N%i==0){
N /= i;
fs[sz]++;
}
sz++;
}
}
if(N > 1){
fac[sz] = N;
fs[sz] = 1;
sz++;
}
return sz;
}
long long DivisorSum_L(long long n, void *mem = wmem){
int i;
long long res;
long long t;
long long s;
int fs;
int *fn;
long long *fc;
if(n<=0){
return 0;
}
walloc1d(&fc, 30);
walloc1d(&fn, 30);
fs =Factor_L(n, fc, fn);
res = 1;
for(i=(0);i<(fs);i++){
int j;
s = t = 1;
for(j=(0);j<(fn[i]);j++){
t *= fc[i];
s += t;
}
res *= s;
}
return res;
}
int main(){
wmem = memarr;
long long N;
rd(N);
wt_L(DivisorSum_L(N));
wt_L('\n');
return 0;
}
// cLay varsion 20190921-1
// --- original code ---
// {
// ll N;
// rd(N);
// wt(DivisorSum(N));
// }
LayCurse