A - Uint47 calculator FZU - 2294
水题,用unsigned long long,自带自动溢出,然后就可以随便写了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
ull mod=1;
const int maxn=5e5+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
string s;
map<string,ull> mp;
int main() {
char op[100];
string tx,ty;
ull x,y;
for(int i=1;i<48;i++){
mod*=2;
}
while(~scanf("%s",op)) {
if(op[0]=='d'&&op[1]=='e') { //def
cin>>s>>x;
mp[s]=x;
cout<<s<<" = "<<x<<'\n';
} else if(op[0]=='s') { //sub
cin>>tx>>ty;
x=mp[tx];
y=mp[ty];
mp[tx]=x=(x-y+mod)%mod;
cout<<tx<<" = "<<x<<'\n';
} else if(op[0]=='a') {
cin>>tx>>ty;
x=mp[tx];
y=mp[ty];
mp[tx]=x=(x+y)%mod;
cout<<tx<<" = "<<x<<'\n';
} else if(op[0]=='m'&&op[1]=='u') {
cin>>tx>>ty;
x=mp[tx];
y=mp[ty];
mp[tx]=x=(x*y)%mod;
cout<<tx<<" = "<<x<<'\n';
} else if(op[0]=='d') {
cin>>tx>>ty;
x=mp[tx];
y=mp[ty];
mp[tx]=x=(x/y)%mod;
cout<<tx<<" = "<<x<<'\n';
} else {
cin>>tx>>ty;
x=mp[tx];
y=mp[ty];
mp[tx]=x=x%y;
cout<<tx<<" = "<<x<<'\n';
}
}
return 0;
}
B - Human life FZU - 2295
最大权闭合子图,k只有5暴力枚举所有状态。然后就是一个裸题了。
答案 是最大正权值-去最大流。如果有人想了解为啥,自行百度吧。。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e3+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int v[maxn];
int pre[maxn][maxn];
int u[maxn];
int n,m,K;
int a[2][5];
int ku[maxn];
vector<int> tv[maxn];
struct edge {
int to,cap,rev;
};
vector <edge> G[maxn];
int level[maxn];
int iter[maxn];
void init(int _n) {
for(int i=0; i<=_n; i++) {
G[i].clear();
tv[i].clear();
}
mem(pre,0);
mem(u,0);
}
void init(){
for(int i=0;i<=n+m+1;i++)G[i].clear();
}
void bfs(int s) {
memset(level,-1,sizeof(level));
queue<int> que;
level[s]=0;
que.push(s);
while(!que.empty()) {
int v= que.front();
que.pop();
for(int i=0; i<G[v].size(); i++) {
edge & e=G[v][i];
if(e.cap>0&&level[e.to]<0) {
level[e.to]=level[v] + 1;
que.push(e.to);
}
}
}
}
void add(int from,int to,int cap) {
edge eg;
eg.to=to;
eg.cap=cap;
eg.rev=G[to].size();
G[from].push_back(eg);
eg.to=from;
eg.cap=0;
eg.rev=G[from].size()-1;
G[to].push_back(eg);
}
int dfs(int v,int t,int f) {
if(v == t)return f;
for(int &i = iter[v]; i < G[v].size(); i++) {
edge &e=G[v][i];
if(e.cap>0 && level[v]<level[e.to]) {
int d=dfs(e.to,t,min(f,e.cap));
if(d>0) {
e.cap-=d;
G[e.to][e.rev].cap+=d;
return d;
}
}
}
return 0;
}
int maxflow(int s,int t) {
int flow=0;
for(;;) {
bfs(s);
if(level[t]<0)return flow;
memset(iter,0,sizeof(iter));
int f;
while((f = dfs(s,t,INF))>0) {
flow +=f;
}
}
}
void dfs(int r) {
u[r]=1;
for(int i=1; i<=n; i++) {
if(pre[r][i]) {
if(u[i]==0) {
dfs(i);
}
for(int j=1; j<=n; j++) {
pre[r][j]|=pre[i][j];
}
}
}
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d%d",&n,&m,&K);
init(n+m+1);
for(int i=1; i<=n; i++) {
scanf("%d",&v[i]);
int k;
scanf("%d",&k);
if(k==0)u[i]=1;
for(int j=0; j<k; j++) {
int x;
scanf("%d",&x);
pre[i][x]=1;
}
}
for(int i=1; i<=n; i++) {
if(u[i]==0) {
dfs(i);
}
}
for(int i=n+1; i<=n+m; i++) {
scanf("%d",&v[i]);
int k;
bool tu[maxn]= {0};
scanf("%d",&k);
for(int j=0; j<k; j++) {
int x;
scanf("%d",&x);
if(tu[x])continue;
tu[x]=1;
for(int l=1; l<=n; l++) {
tu[l]|=pre[x][l];
}
}
for(int j=1; j<=n; j++) {
if(tu[j]) {
tv[i].push_back(j);
}
}
}
for(int i=0; i<K; i++) {
scanf("%d%d",&a[0][i],&a[1][i]);
}
int mx=0;
for(int i=0; i<1<<K; i++) {
mem(ku,0);
init();
for(int j=0; j<K; j++) {
ku[a[(i>>j)&1][j]+n]=1;
// debug(a[(i>>j)&1][j]+n);
}
int sum=0;
for(int i=n+1; i<=n+m; i++) {
if(ku[i]==1)continue;
// debug(i);
add(0,i,v[i]);
for(int j=0; j<tv[i].size(); j++) {
add(i,tv[i][j],inf);
}
sum+=v[i];
}
for(int i=1; i<=n; i++)add(i,n+m+1,v[i]);
mx=max(sum-maxflow(0,n+m+1),mx);
}
printf("%d\n",mx);
}
return 0;
}
D - Number theory FZU - 2297
一开始还以为是大数,java 了一发,大数了一发,全都TLE,正解就是一个线段树。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e3+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int c[maxn][maxn];
int q[maxn][maxn];
int b2[maxn];
long long pow(long long x,long long n,long long mod=1e9+7) {
long long res=1;
while(n>0) {
if(n&1)res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res%mod;
}
int main() {
c[1][1]=1;
c[1][0]=1;
for(int i=1; i<1e3+1; i++) {
c[i+1][0]=1;
// printf("%d ",c[i+1][0]);
for(int j=1; j<=i+1; j++) {
c[i+1][j]=(c[i][j-1]+c[i][j])%mod;
// printf("%d ",c[i+1][j]);
}
}
for(int i=1; i<1e3+1; i++) {
for(int j=0; j<=i; j++) {
q[i][j+1]=(q[i][j]+c[i][j])%mod;
}
}
b2[0]=1;
for(int i=1; i<1e3+1; i++) {
b2[i]=(b2[i-1]*2)%mod;
}
int t;
scanf("%d",&t);
while(t--) {
int n,m;
scanf("%d%d",&n,&m);
if(m>n) {
puts("0");
} else {
cout<<(q[n][n+1]-q[n][m]+mod)%mod*pow(b2[n],mod-2,mod)%mod<<endl;
}
}
return 0;
}
E - Traffic jamFZU - 2298
最短路,处理下到某个点的情况,如果是红灯,时间变为到绿灯开始。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=5e5+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int a[maxn];
int cost[maxn];
int n,m;
struct edge {
int to,c,next;
} eg[maxn*2];
int head[maxn],tot,vis[maxn];
void init() {
mem(head,-1);
tot=0;
}
void add(int u,int v,int c) {
eg[tot].to=v;
eg[tot].c=c;
eg[tot].next=head[u];
head[u]=tot++;
}
int main() {
int t;
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
init();
for(int i=0; i<m; i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
int st,en;
scanf("%d%d",&st,&en);
queue<int> q;
q.push(st);
mem(cost,inf);
mem(vis,0);
cost[st]=0;
while(q.size()) {
int v=q.front();
q.pop();
vis[v]=0;
for(int i=head[v]; i!=-1; i=eg[i].next) {
int d=cost[v]+eg[i].c,to=eg[i].to;
if(to!=en&&(d/a[to])&1)d=(d/a[to]+1)*a[to];
if(d<cost[to]) {
cost[to]=d;
if(vis[to]==0) {
vis[to]=1;
q.push(to);
}
}
}
}
printf("%d\n",cost[en]);
}
return 0;
}
G - IoU FZU - 2300
签到题
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
ull mod=1;
const int maxn=5e5+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
string s;
map<string,ull> mp;
int T;
struct node {
ll x,y,w,h;
}a[3];
int main() {
scanf("%d", &T);
while (T --) {
scanf("%lld %lld %lld %lld", &a[0].x,&a[0].y,&a[0].w,&a[0].h);
scanf("%lld %lld %lld %lld", &a[1].x,&a[1].y,&a[1].w,&a[1].h);
ll wi = (min(a[0].x+a[0].w, a[1].x+a[1].w)-max(a[0].x, a[1].x));
ll hi = (min(a[0].y+a[0].h, a[1].y+a[1].h)-max(a[0].y, a[1].y));
ll un;
if(wi > 0 && hi > 0) un = wi*hi;
else un = 0;
//debug(un);
ll sum = a[0].w*a[0].h+a[1].w*a[1].h-un;
//debug(sum);
printf("%.2f\n", 1.0*un/sum);
}
return 0;
}
/*
6
1 1 1 1
1 1 2 2
1 1 2 1
1 1 1 2
1 1 2 2
2 0 1 1
0 3 3 3
2 2 2 1
0 3 3 3
2 4 5 5
1 1 1 1
-100 -100 1 1
*/
H - Chosen by god FZU - 2301
题意:n点伤害随机分配,求分配到敌人身上大于等于m,的期望,就是求C(M,N)+...+C(M,N);
题解:打个组合数的表,然后前缀处理一下。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=1e3+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
int c[maxn][maxn];
int q[maxn][maxn];
int b2[maxn];
long long pow(long long x,long long n,long long mod=1e9+7) {
long long res=1;
while(n>0) {
if(n&1)res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res%mod;
}
int main() {
c[1][1]=1;
c[1][0]=1;
for(int i=1; i<1e3+1; i++) {
c[i+1][0]=1;
// printf("%d ",c[i+1][0]);
for(int j=1; j<=i+1; j++) {
c[i+1][j]=(c[i][j-1]+c[i][j])%mod;
// printf("%d ",c[i+1][j]);
}
}
for(int i=1; i<1e3+1; i++) {
for(int j=0; j<=i; j++) {
q[i][j+1]=(q[i][j]+c[i][j])%mod;
}
}
b2[0]=1;
for(int i=1; i<1e3+1; i++) {
b2[i]=(b2[i-1]*2)%mod;
}
int t;
scanf("%d",&t);
while(t--) {
int n,m;
scanf("%d%d",&n,&m);
if(m>n) {
puts("0");
} else {
cout<<(q[n][n+1]-q[n][m]+mod)%mod*pow(b2[n],mod-2,mod)%mod<<endl;
}
}
return 0;
}
J - Mind control FZU - 2303
题意:n个人,m个蛋糕,你把蛋糕给一个人,他后面的人也会被选上,例如选1 ,2 3 4 5 ....等都会被选上,选 3 4 5 ...都会被选上,求选上人数的期望。
题解:给蛋糕的总肯能是C(M,N),选的人最高为1 的选择种数是,C(M-1,N-1),选一个蛋糕给1,然后其他蛋糕给他后面的人,以此类推,最高为2 选择种数是 ,C(M-1,N-2),最高为3 可能是 C(m-1,N-3);
然后权值乘以概率就是期望 ,N*C(M-1,N-1)+(N-1)*C(M-1,N-2)+....+M*C(M-1,M-1)/C(M,N);
看到权值是 N,N-1肯定要化进组合数 ,大答案*m/m, 就可以化成M*C(M,N)+M*(M,N-1)+.....+M*C(M,M)/C(M,N);
在化简 M*C(M+1,N+1)/C(M,N)最后化为M*(N+1)/(M+1);
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> P;
#define bug printf("*********\n");
#define debug(x) cout<<"["<<x<<"]" <<endl;
#define mid (l+r)/2
#define chl 2*k+1
#define chr 2*k+2
#define lson l,mid,chl
#define rson mid,r,chr
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a));
const long long mod=1e9+7;
const int maxn=5e5+5;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const double eps=1e-8;
long long pow(long long x,long long n,long long mod=1e9+7) {
long long res=1;
while(n>0) {
if(n&1)res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res%mod;
}
void read(ll &sum) {
sum=0;
int flag=0;
char ch=getchar();
while(!(ch>='0'&&ch<='9')) {
if (ch == '-') {
flag = 1;
}
ch=getchar();
}
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();
if(flag)sum*=-1;
}
int main() {
ll t;
read(t);
while(t--) {
ll n,m;
read(n);
read(m);
cout<<m*(n+1)%mod*pow(m+1,mod-2,mod)%mod<<"\n";
}
return 0;
}