Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
while :; do
dd if=/dev/urandom of=file.cpp bs=1K count=1
if clang++ file.cpp && [[ $(echo 123 | ./a.out) -eq 1591 ]]; then
cat file.cpp; echo win
fi
done
#!/bin/bash
i=`cat i`;
compile() {
r=$(clang++ file.cpp 2>&1| grep generated)
if echo $r | grep -q ' 0 errors'; then
let i++;
echo $i > i
cp file.cpp $i.cpp
fi
echo -ne "\r$r";
}
while :; do
dd if=/dev/urandom of=file.cpp bs=1K count=1 2>/dev/null
if compile && [[ $(echo 123 | ./a.out 2>/dev/null) -eq 1591 ]]; then
echo win
exit
fi
done
#define PM (1 << 16)
#define CZ (1 << 16)
char c[CZ + 1];
int pp[PM + 1];
char v[PM + 1];
int pc = 0;
int64_t prime_r(int n)
{
// first primes
pc = 0;
memset(pp,0x00, PM*sizeof(int));
memset(v,0xff, PM*sizeof(char));
for(int i = 2; i*i < PM; i++) if(v[i])for(int j = i*i; j < PM; j += i)v[j] = 0;
for(int i = 2; i < PM; i++)if(v[i]) pp[pc++] = i;
// sum of prime
int64_t sum = 0;
for(int64_t i = 0; pp[i] <= n && i < pc; i++)sum += pp[i];
for (int64_t ii = pp[pc - 1]; ii <= n; ii += CZ)
{
memset(c,0xff, CZ*sizeof(char));
for(int64_t i = 0; i < pc; i++)
{
int h = ii % pp[i];
int j = (h > 0) ? pp[i] - h: 0;
for(; j < CZ; j += pp[i]) c[j] = 0;
}
int64_t si = ((ii + CZ) >= n) ? n - ii : CZ;
for(int64_t i = 0; i < si; i+=2) if(c[i]) sum += (i + ii);
}
return sum;
}
#define PM (1 << 16)
#define CZ (1 << 16)
char c[CZ + 1];
int pp[PM + 1];
char v[PM + 1];
int pc = 0;
int64_t cum_16 [16] = {
0,
0x1c20fef2f09ca,
0x6c63d57586d96,
0xeec0010744a8e,
0x1a233866cf59db,
0x28618ac5327caa,
0x399e13d0ec9c4e,
0x4dd275b39fbecc,
0x64fa7e62f08931,
0x7f0f2d33432004,
0x9c0f0b992adb2e,
0xbbf49b7cf3b1fe,
0xdebe8bda61ec0f,
0x10467f40dc3f52f,
0x12ceee2b93e7816,
0x158524685365cc7
};
int64_t prime_rr16(int n)
{
// first primes
pc = 0;
memset(pp,0x00, PM*sizeof(int));
memset(v,0xff, PM*sizeof(char));
for(int64_t i = 2; i*i < PM; i++) if(v[i])for(int64_t j = i*i; j < PM; j += i)v[j] = 0;
for(int64_t i = 2; i < PM; i++)if(v[i]) pp[pc++] = i;
// sum of prime
int64_t sum = 0;
for(int64_t i = 0; pp[i] <= n && i < pc; i++)sum += pp[i];
int64_t s = (n >> 27)? (n & 0xf8000000) + 1 : pp[pc-1];
if(n >> 27) sum = 0;
sum += cum_16[n >> 27];
for (int64_t ii = s; ii <= n; ii += CZ)
{
memset(c,0xff, CZ*sizeof(char));
for(int64_t i = 0; i < pc; i++)
{
int64_t h = ii % pp[i];
int64_t j = (h > 0) ? pp[i] - h: 0;
for(; j < CZ; j += pp[i]) c[j] = 0;
}
int64_t si = ((ii + CZ) >= n) ? n - ii : CZ;
for(int64_t i = 0; i < si; i+=2) if(c[i]) sum += (i + ii);
}
return sum;
}
6_main.cpp:13:3: error: unknown type name '__int64'; did you mean '__int64_t'?
__int64 s=0;
^~~~~~~
__int64_t
/usr/include/x86_64-linux-gnu/bits/types.h:44:25: note: '__int64_t' declared here
typedef signed long int __int64_t;
^
1 error generated.
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
int main()
{
std::vector<long long> arr
(
( std::istream_iterator<long long>(std::cin) ),
std::istream_iterator<long long>()
);
for (int i = arr.size() - 1; i > 1; --i)
{
arr[i] -= 2 * arr[i - 1] - arr[i - 2];
}
for (auto x : arr)
{
std::string str;
for (; x; x /= 96)
{
str += char(x % 96 + 32);
if ( std::string("\\\"\'").find(str.back()) != std::string::npos)
str += '\\';
}
std::cout << std::string(str.rbegin(), str.rend());
}
}
~N^0.5 с предподсчетом за ~N(асимптотики с точностью до логарифмов). И тогда отделить решения было бы очень трудно. Я ничего не обфусцировал, и если бы написал цикл в 19 строчке не до N, а до (n-x+1)/2, то скорее всего, выиграл бы.$ uname -a
Linux moon 3.6.10-1-ARCH #1 SMP PREEMPT Tue Dec 11 09:40:17 CET 2012 x86_64 GNU/Linux
$ clang -v
clang version 3.2 (tags/RELEASE_32/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
$ cat /proc/cpuinfo | grep -F 'model name' | head -1
model name: AMD FX(tm)-6100 Six-Core Processor
Оценивать скорость программы по 4 тестовым числам — недостаточно. Легко может победить программа с более плохим «основным кодом», но с более удачным выбором значений таблицы.
//@shadeware
#include <cstdio>
#include <vector>
#include <cmath>
#include <cstdlib>
int main()
{
//especially for
http://habrahabr.ru
//расшифровка предподсчета
long long precalc[66] = {};
for (int i = 0; i < 64 * 7; i++)
{
precalc[i / 7 + 2] = precalc[i / 7 + 2] * 96 + "+.Uy[e^4MAqc>,3Vq8a}n3-teC`p2r/)Fl[2Z)|>Ke2O~7<Co2:Q]dpI23fM5~22\'X S\'}2\"z;})81lu^+vx1s sc[U1g%Wzq+1s3 ?1[1HQoI$^1TH2EaX1cEzV,Z1CHMY7o1DHmqPA1D#4oe]1F&|\'F^1R`5\'k)0{z2\\Oc1<T/G)x10BVH)~1B,ZzW:1)>FZ%$1+[%c\"<0dAd/tP1->\"0M!1;JwZ6!1*%j_y00V6$w!u10I dHR1PXF]r20!?Xhxw1?nbdEr0e-/ZE_0s:6:z.0[}+qG51<y9WfF0.^#nCQ0s)I(d/0XfrAQB10^,7e?0^X\'W4 13M.MfL05Q2Oz50fxnC)E0V@NGo+0=Z?sS/0I_*[l0\\W)O u1pw[AYJ/A?Xk;g0rbiYbu1*{Pj>f0\'\"aEs60OP;ZHs0zsjvXg0:~BPSu/aWY+&F1_aM,<q"[i] - 32;
}
for (int i = 0; i < 64; i++)
{
precalc[i + 2] += 2 * precalc[i + 1] - precalc[i];
}
int n;
scanf("%d", &n);
long long answer;
int left;
if (n & (1 << 23) ) //n ближе к правой границе блока
{
answer = -precalc[(n >> 24) + 2];
//так как answer отрицательный, модуль числа будет уменьшатся
//при сложении, следовательно, основной код не изменится.
left = (n >> 24 << 24) + (1 << 24);
std::swap(left, n);
++left;
}
else //n ближе к левой границе
{
left = n >> 24 << 24;
if (left == 0)
{
answer = 2 * (n > 1);
}
else
{
answer = precalc[(n >> 24) + 1];
}
}
int sq = sqrt(n) + 1e-7;
//уменьшаем в 2 раза все переменные, так как четные числа учитываться не будут
n = (n - 1) / 2;
left /= 2;
sq /= 2;
std::vector<bool> sieve(sq + 1), block(n - left + 1);
block[0] = !left;
//блочное решето
for (int i = 1; i <= sq; ++i)
{
if (!sieve[i])
{
//просеивание до корня
//так как i уменьшено в 2 раза, то исходное i = 2 * i + 1
//i * i -> 2 * i * (i + 1)
for (int j = 2 * i * (i + 1); j <= sq; j += 2 * i + 1)
{
sieve[j] = 1;
}
//просеивание блока
int j;
//вычисление левой границы, от которой будем просеивать
if (left == 0)
{
j = 2 * i * (i + 1);
}
else
{
//находим первое j, которое кратно i && >= left
j = 2 * (left + i);
j -= j % (2 * i + 1);
//просеивать четные числа ни к чему, они будут пропускаться
if (j % 2 == 0)
{
j += 2 * i + 1;
}
j /= 2;
}
for (; j <= n; j += 2 * i + 1)
{
block[j - left] = 1;
}
}
}
//подсчет ответа
for (int i = 0; i <= n - left; ++i)
{
if (!block[i])
{
answer += i * 2 + left * 2 + 1;
}
}
printf("%lld", std::llabs(answer));
}
for(;++q*q<n;);
#include <cmath>
q=sqrt(n)+1e-7;
Из-за вдвое меньшей используемой памяти?
++q*q<n
for(;q*q<n;++q);
for (int i = 0; i < 64; i++)
{
precalc[i + 2] += 2 * precalc[i + 1] - precalc[i];
}
for (int i = 0; i < n>>24; i++)
{
answer = precalc[i + 2] += 2 * precalc[i + 1] - precalc[i];
}
\' вместо '.N, а n.#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(!p[i])for(j=i*i;j<=n;j+=i)p[j]=1;for(;n-->2;)s+=p[n]?0:n;std::cout<<s;}
#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(j=!p[i])for(;j++*i<=n;)p[j*i]=1;for(;n-->2;)s+=p[n]?0:n;std::cout<<s;}
n=2 ответ 2, у тебя 0. Ещё SIGSEGV при n = 1<<30.#include<iostream>
char p[1<<30];long long n,s,i=1,j;int main(){std::cin>>n;for(;++i<4e4;)if(j=!p[i])for(;++j*i<=n;)p[j*i]=1;for(;n;)s+=!p[n]*n--;std::cout<<s-1;}
If a side effect on a scalar object is unsequenced relative to either a different side effect
on the same scalar object or a value computation using the value of the same scalar
object, the behavior is undefined.
Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.
std::cin>>n можно внести внутрь for
Результаты новогоднего Хабра-соревнования по программированию, анализ и обсуждение