Pagini recente » Borderou de evaluare (job #2138109) | Cod sursa (job #1466092)
# include <bits/stdc++.h>
# define ll long long
using namespace std;
/*class Reader {
public:
Reader(const string& filename):
m_stream(filename),
m_pos(kBufferSize - 1),
m_buffer(new char[kBufferSize]) {
next();
}
Reader& operator>>(int& value) {
value = 0;
while (current() < '0' || current() > '9')
next();
while (current() >= '0' && current() <= '9') {
value = value * 10 + current() - '0';
next();
}
return *this;
}
private:
const int kBufferSize = 32768;
char current() {
return m_buffer[m_pos];
}
void next() {
if (!(++m_pos != kBufferSize)) {
m_stream.read(m_buffer.get(), kBufferSize);
m_pos = 0;
}
}
ifstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};*/
ifstream fi("puteri.in");
ofstream fo("puteri.out");
const int pw[] = {-1,1};
const int nmax = 1 << 7;
inline int md(int x,int mod)
{
int p = x;
while (p >= mod) p -= mod;
return p;
}
int ok(int p)
{
bool k = 0;
for (int i = 2;i*i <= p;++i)
if (!(p%i))
{
p /= i;
if (!(p%i)) return 0;
k = 1 - k;
}
if (p > 1) k = 1 - k;
return pw[k];
}
int main(void)
{
int n;
fi>>n;
int * a;
int * b;
int * c;
int ***s;
a = new int [n+1];
b = new int [n+1];
c = new int [n+1];
ll * ans;
int nx = 0;
for (int i = 1;i <= n;++i) fi>>a[i]>>b[i]>>c[i],nx = max(max(nx,a[i]),max(b[i],c[i]));
nx *= 2;
ans = new ll [nmax+5];
s = new int** [nx];
for (int i = 0;i < nx;++i) s[i] = new int*[nx];
for (int i = 0;i < nx;++i)
for (int j = 0;j < nx;++j) s[i][j] = new int[nx];
for (int i = 0;i < nx;++i)
for (int j = 0;j < nx;++j)
memset(s[i][j],0,sizeof(s[i][j]));
for (int mod = 2;mod <= nx;++mod)
if (ok(mod))
{
for (int i = 1;i <= n;++i)
s[md(a[i],mod)][md(b[i],mod)][md(c[i],mod)]++;
for (int i = 1;i <= n;++i)
if (s[md(a[i],mod)][md(b[i],mod)][md(c[i],mod)])
{
int x = md(a[i],mod),y = md(b[i],mod),z = md(c[i],mod);
int ix = md(mod - x,mod),iy = md(mod - y,mod),iz = md(mod - z,mod);
if (x == ix && iy == y && z == iz)
ans[mod] += 1ll * (s[x][y][z] - 1) * s[x][y][z] / 2;
else
ans[mod] += 1ll * s[x][y][z] * s[ix][iy][iz];
s[x][y][z] = s[ix][iy][iz] = 0;
}
}
ll rs = 0;
for (int i = 2;i <= nx;++i) rs += ok(i) * ans[i];
return fo << rs << '\n',0;
}