Pagini recente » Cod sursa (job #378067) | Cod sursa (job #1199916) | Cod sursa (job #447137) | Cod sursa (job #1529981) | Cod sursa (job #2417622)
#include <bits/stdc++.h>
#define maxN 100002
#define maxL 32
#define ll long long
#define pii pair < int, int >
using namespace std;
FILE *fin = freopen("fft2d.in", "r", stdin);
FILE *fout = freopen("fft2d.out", "w", stdout);
int f, n;
vector < pii > V[maxL];
ll dp[maxN];
map < int, int > cnt[maxL][maxL];
ll ans;
int main()
{
scanf("%d%d", &f, &n);
for (int i = 0; i < n; ++ i)
{
int x, y;
scanf("%d%d", &x, &y);
V[x].push_back(pii{y, i});
}
ans = (1 << (f - 1));
ans = (1LL * ans * ans);
for (pii it : V[f - 1])
{
int x = it.first;
dp[it.second] = 1;
//msk[f - 1] = x;
cnt[f - 1][f - 1][x] += dp[it.second];
for (int i = f - 2; i >= 0; -- i)
{
if (x & (1 << (f - i - 2))) x ^= (1 << (f - i - 2));
//msk[i] = x;
cnt[i][f - 1][x] += dp[it.second];
}
ans -= (1LL << (f - 1));
}
for (int lev = f - 2; lev >= 0; -- lev)
{
for (pii it : V[lev])
{
int x = it.first;
dp[it.second] = 1 << (f - lev - 1);
dp[it.second] -= cnt[lev][lev][x];
for (int i = lev + 1; i < f; ++ i)
{
if (x & (1 << (f - i - 1))) x ^= (1 << (f - i - 1));
dp[it.second] -= cnt[lev][i][x];
}
x = it.first;
cnt[lev][lev][x] += dp[it.second];
for (int i = lev - 1; i >= 0; -- i)
{
if (x & (1 << (f - i - 2))) x ^= (1 << (f - i - 2));
cnt[i][lev][x] += dp[it.second];
}
x = it.first;
for (int i = lev + 1; i < f; ++ i)
{
if (x & (1 << (f - i - 1))) x ^= (1 << (f - i - 1));
cnt[lev][i][x] += dp[it.second];
}
ans -= 1LL * (1LL << lev) * dp[it.second];
}
}
printf("%d\n", ans);
return 0;
}