投递牛客等公司 >
0 点赞 评论 收藏
分享
投递牛客等公司 >
0 点赞 评论 收藏
分享
:求问这个地方的欧拉降幂a^b%p 为甚麽默认b小于等于m[p]..直接采用a^(b%m[p]) %p 而不是 a^(b%m[p]+m[p])%p??? 即quick_pow(2,dfs(i-1,m[mod])+1,mod)为甚麽不是quick_pow(2,dfs(i-1,m[mod])+1+m[mod],mod)??
投递牛客等公司 >
0 点赞 评论 收藏
分享
投递牛客等公司 >
0 点赞 评论 收藏
分享
投递牛客等公司 >
0 点赞 评论 收藏
分享
投递牛客等公司 >
0 点赞 评论 收藏
分享
你以为你CF过了四题:也可以把边集状压存下来,用set判重就好。 #include <bits/stdc++.h>
using namespace std;
const int N = 10;
int G[N][N];
vector<pair<int, int>> edges;
map<pair<int, int>, int> dic;
int getid(int x, int y)
{
if (x > y) swap(x, y);
assert(x < y);
if (dic[{x, y}]) return dic[{x, y}];
return dic[{x, y}] = dic.size();
}
long long check()
{
long long hash = 0;
for (auto& e : edges)
{
int u = p[e.first], v = p[e.second];
if (G[u][v])
hash |= 1LL << getid(u, v);
else
return -1;
}
return hash;
}
int main()
{
int n, a, b;
while (~scanf("%d%d%d", &n, &a, &b))
{
memset(G, 0, sizeof(G));
dic.clear();
edges.clear();
for (int i = 0, u, v; i < a; i++)
{
scanf("%d%d", &u, &v);
--u, --v;
edges.emplace_back(u, v);
}
for (int i = 0, u, v; i < b; i++)
{
scanf("%d%d", &u, &v);
--u, --v;
G[u][v] = G[v][u] = 1;
getid(u, v);
}
for (int i = 0; i < n; i++) p[i] = i;
set<long long> s;
do
{
int tmp = check();
if (~tmp) s.insert(tmp);
} while (next_permutation(p, p + n));
int ans = s.size();
printf("%d\n", ans);
}
}
投递牛客等公司 >
0 点赞 评论 收藏
分享
关注他的用户也关注了: