B 数学
1!!! = 1
2!!! = 2
3!! = 720
3!!! = 260121894356579510020490322708104361………………00000000000000000000000000000000000
虽然3!!! 很明显已经 >= 1e9(模的范围)
可是 3!!! = 720! 每一次累乘运算的时候都取模,720 并没有大于 mod,还是得特判的
接下来就是4
4!! = 620448401733239439360000
4!! 已经大于 1e9,
4!!! = 4!! ! = 620448401733239439360000 !
620448401733239439360000 已经大于1e9 ,而模最大才1e9 ,阶乘过程中必然出现至少有一项为 0 的时候,(累乘时数字等于mod),这样阶乘就全为0了
#include <cstdio>
using namespace std;
int main(){
int _;
scanf("%d",&_);
int a,b;
while(_--){
scanf("%d %d",&a,&b);
if(a == 1)
printf("%d\n",1 % b);
else if(a == 2)
printf("%d\n",2 % b);
else if(a == 3){
long long ans = 1;
for(int i = 1; i <= 720; i++) {
ans = ans * i % b;
}
printf("%lld\n", ans);
}
else
printf("0\n");
}
return 0;
}
D 题 bfs + 剪枝
题解说 : 因子最多只有240个左右
这样的话就直接dfs进行搜索就行了,把所有的情况都写出来,
因为是因子,这样的话就不用素数筛了,每个因子只允许出现一次,dfs搜该情况的时候直接就把所有的情况全搜一遍就ok了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
int n, all;
map<int, int>m;
void dfs(int x, int y) {
if(x == 1){
all = min(all, y);
return;
}
for(int i = 2; i <= x; i++){
if(x % i == 0 && !m[i]){
m[i] = 1;
dfs(x / i, y + i);
m[i] = 0;
}
}
return;
}
int main(){
while (cin >> n) {
all = 1 + n;
m.clear();
m[n] = 1;
dfs(n, 0);
cout << all << endl;
}
return 0;
}
E LCA
现在把整个城市看作一棵n个结点的树,牛妹在点1,牛牛家在点a,花店在点b,跑腿的起始点在c
因为题目上来就说是一个树,这样的话就不用最短路去求每两个节点之间的距离了,那么就是LCA,
求的是 max( a->1 , c->b->1 ) >= 规定时间 的概率