D. Made In Heaven
A*算法,第k短路,套模板即可
#include<bits/stdc++.h>
using namespace std;
#define INF 0xffffff
#define MAXN 100010
namespace fastIO {
#define BUF_SIZE 100000
//fread -> read
bool IOerror = 0;
inline char nc() {
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if(p1 == pend) {
p1 = buf;
pend = buf + fread(buf, 1, BUF_SIZE, stdin);
if(pend == p1) {
IOerror = 1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline void read(int &x) {
char ch;
while(blank(ch = nc()));
if(IOerror) return;
for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
}
#undef BUF_SIZE
};
using namespace fastIO;
struct AA
{
int to;
int val;
int next;
};
struct BB
{
int to;
int g,f;
bool operator<(const BB &aa ) const
{
if(f==aa.f)
return aa.g<g;
return aa.f<f;
}
};
AA edge[MAXN],edge2[MAXN];
int N,M,S,E,K,T,cnt,cnt2,ans;
int dis[1010],visit[1010],head[1010],head2[1010];
void addedge(int from,int to,int val)
{
edge[cnt].to=to;
edge[cnt].val=val;
edge[cnt].next=head[from];
head[from]=cnt++;
}
void addedge2(int from,int to,int val)
{
edge2[cnt2].to=to;
edge2[cnt2].val=val;
edge2[cnt2].next=head2[from];
head2[from]=cnt2++;
}
bool spfa(int s,int n,int head[],AA edge[],int dist[])
{
queue<int>Q1;
int inq[1010];
for(int i=0;i<=n;i++)
{
dis[i]=INF;
inq[i]=0;
}
dis[s]=0;
Q1.push(s);
inq[s]++;
while(!Q1.empty())
{
int q=Q1.front();
Q1.pop();
inq[q]--;
if(inq[q]>n)
return false;
int k=head[q];
while(k>=0)
{
if(dist[edge[k].to]>dist[q]+edge[k].val)
{
dist[edge[k].to]=edge[k].val+dist[q];
if(!inq[edge[k].to])
{
inq[edge[k].to]++;
Q1.push(edge[k].to);
}
}
k=edge[k].next;
}
}
return true;
}
int A_star(int s,int t,int n,int k,int head[],AA edge[],int dist[])
{
BB e,ne;
int cnt=0;
priority_queue<BB>Q;
while(!Q.empty()) Q.pop();
if(dis[s]==INF)
return -1;
e.to=s;
e.g=0;
e.f=e.g+dis[e.to];
Q.push(e);
while(!Q.empty())
{
e=Q.top();
Q.pop();
if(e.g>T) return -1;
if(e.to==t)//找到一条最短路径
{
cnt++;
}
if(cnt==k)//找到k短路
{
return e.g;
}
for(int i=head[e.to]; i!=-1; i=edge[i].next)
{
ne.to=edge[i].to;
ne.g=e.g+edge[i].val;
ne.f=ne.g+dis[ne.to];
Q.push(ne);
}
}
return -1;
}
int main()
{
int a,b,c;
while(~scanf("%d%d",&N,&M))
{
//read(S);read(E);read(K);read(T);
scanf("%d%d%d%d",&S,&E,&K,&T);
memset(head,-1,sizeof(head));
memset(head2,-1,sizeof(head2));
cnt=1;
cnt2=1;
for(int i=1;i<=M;i++)
{
scanf("%d%d%d",&a,&b,&c);
// read(a);read(b);read(c);
addedge(a,b,c);
addedge2(b,a,c);
}
spfa(E,N,head2,edge2,dis);
ans=A_star(S,E,N,K,head,edge,dis);
if(ans!=-1&&ans<=T)
printf("yareyaredawa\n");
else printf("Whitesnake!\n");
}
return 0;
}
/*
2 2
1 2 2 1000000000
1 2 5
2 1 4
*/
F. Fantastic Graph
贪心,挨着判断即可
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=4010;
const int INF=1e9;
int X,Y;
struct node
{
int id,sum;
}d[maxn];
int du[maxn];
bool cmp(node a,node b)
{
if(a.sum>b.sum)return 1;
else
{
return 0;
}
}
vector<int>G[maxn];
int main()
{
int n,m,k;
int ans=1;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(d,0,sizeof(d));
scanf("%d%d",&X,&Y);
int u,v;
for(int i=1;i<=k;i++)
{
scanf("%d%d",&u,&v);
v=v+n;
G[u].push_back(v);
G[v].push_back(u);
d[u].id=u;d[u].sum++;
du[u]++;
du[v]++;
d[v].id=v;d[v].sum++;
}
sort(d+1,d+1+n+m,cmp);
int flag=0;
for(int i=1;i<=n+m;i++)
{
if(d[i].sum>=X)continue;
if(d[i].sum<X)
{
flag=1;
break;
}
int u=d[i].id;
for(int j=0;j<G[u].size();j++)
{
int v=G[u][j];
if(du[v]-1>=X)
{
du[v]--;
}
else
{
flag=1;
break;
}
}
}
printf("Case %d: ",ans++);
if(!flag)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
G. Spare Tire
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <queue>
#include <time.h>
#include <vector>
#include <string>
#include <math.h>
#include <cstring>
#include <cstdlib>
#include <stdio.h>
#include <iomanip>
#include <iostream>
#include <algorithm>
#define PI acos(-1)
#define ll long long
#define inf 0x3f3f3f3f
#define ull unsigned long long
using namespace std;
const ll mod=1e9+7;
const int MAXN = 10005;
bool flag[MAXN];
ll primes[MAXN/3],pi;
ll t[40],cnt,ans,n,m;
ll inv2,inv3,inv6;
void Prime()
{
int i,j;
pi=0;
memset(flag,false,sizeof(flag));
for(i=2;i<MAXN;i++)
{
if(!flag[i]) primes[++pi] = i;
for(j=1;(j<=pi)&&(i*primes[j]<MAXN);j++)
{
flag[i*primes[j]]=true;
if (i%primes[j]==0)//这句保证每个非素数只被筛去一次、、
break;
}
}
}
void solve(ll k)
{
cnt=0;
for(int i=1;i<=pi&&primes[i]*primes[i]<=k;i++)
{
if(k%primes[i]==0)
{
t[++cnt]=primes[i];
while(k%primes[i]==0) k=k/primes[i];
}
}
if(k>1) t[++cnt]=k;
}
long long qpow(long long a,long long b)
{
a=a%mod;
long long ans=1;
while(b)
{
if(b&1)
{
ans=(ans*a)%mod;
b--;
}
b>>=1;
a=a*a%mod;
}
return ans;
}
ll cal(ll e)
{
ll s;
s=e*(e+1)%mod;
s=s*(e+2)%mod;
s=s*inv3%mod;
return s;
}
void dfs(ll i,ll val,ll k)
{
ll d=n/val;
if(k%2==1)
{
ll o=val*d*(d+1)*inv2+val*val*d*(d+1)*(2*d+1)*inv6;
//ll o=(((((val*val%mod)*d%mod)*(d+1)%mod)*(2*d+1)%mod)+((3*d*(d+1)%mod)*k%mod)+mod)%mod;
//o=o*inv6%mod;
ll o=((((val*d%mod)*(d+1))%mod)*inv2%mod+((((val*val)%mod*d)%mod*(d+1))%mod*(2*d+1)%mod)*inv6%mod+mod)%mod;
ans=(ans-o)%mod;
}
else
{
ll o=((((val*d%mod)*(d+1))%mod)*inv2%mod+((((val*val)%mod*d)%mod*(d+1))%mod*(2*d+1)%mod)*inv6%mod+mod)%mod;
//ll o=(((((val*val%mod)*d%mod)*(d+1)%mod)*(2*d+1)%mod)+((3*d*(d+1)%mod)*k%mod)+mod)%mod;
//o=o*inv6%mod;
ans=(ans+o)%mod;
}
for(int j=i+1;j<=cnt;j++)
{
ll y=val*t[j];
dfs(j,y,k+1);
}
}
int main()
{
Prime();
inv3=qpow(3,mod-2);
inv2=qpow(2,mod-2);
inv6=qpow(6,mod-2);
while(scanf("%lld%lld",&n,&m)!=EOF)
{
solve(m);
ans=cal(n);
//cout<<ans<<endl;
for(int i=1;i<=cnt;i++)
{
dfs(i,t[i],1);
}
cout<<(ans+mod)%mod<<endl;
}
}
I. Lattice's basics in digital electronics
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
string table_16[20]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string change(string s_16)
{
int s_n=s_16.length();
int s_now;
string s_res="";
for(int i=0;i<s_n;i++)
{
if(s_16[i]>='a'&&s_16[i]<='f')
{
s_now=s_16[i]-'a'+10;
}
else if(s_16[i]>='A'&&s_16[i]<='F')
{
s_now=s_16[i]-'A'+10;
}
else
{
s_now=s_16[i]-'0';
}
s_res+=table_16[s_now];
}
return s_res;
}
char ss[1000010];
string s,h,ch,k;
map<string,int>mp;
int main()
{
//ios::sync_with_stdio(false);
int t,n,m,i,cnt,flag,len,x,j,l;
char c;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
mp.clear();
for(i=1;i<=n;i++)
{
scanf("%d",&x);
scanf("%s",ss);
s=(string(ss));
mp[s]=x;
}
scanf("%s",ss);
s=(string(ss));
h=change(s);
//cout<<h<<"^^"<<endl;
ch="";
len=h.length()/9;
len*=9;
for(i=0;i<len;)
{
cnt=0;
for(j=0;j<=7;j++)
{
if(h[i+j]=='1')
{
cnt++;
}
}
flag=i;
i=i+9;
if((cnt%2)!=0&&h[i-1]=='0')///奇数
{
//ch=ch+h.substr(flag,8);
k="";
for(l=flag;l<=flag+7;l++)
{
k+=h[l];
}
ch+=k;
//cout<<ch<<"!!!"<<endl;
}
else if(cnt%2==0&&h[i-1]=='1')
{
//ch=ch+h.substr(flag,8);
k="";
for(l=flag;l<=flag+7;l++)
{
k+=h[l];
}
ch+=k;
//cout<<ch<<"$$"<<endl;
}
}
//cout<<ch<<endl;
ch+='2';
k="";
cnt=0;
len=ch.length();
for(i=0;i<len;i++)
{
if(mp[k]!=0)
{
if(cnt>=m)
break;
putchar(mp[k]);
cnt++;
k=ch[i];
}
else
{
//cout<<ch[i]<<endl;
k+=ch[i];
}
}
printf("\n");
}
}
K. Supreme Number
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;
long long a[20]={1,2,3,5,7,11,13,17,23,31,37,53,71,73,113,131,137,173,311,317};
int main(){
long long i,j;
long long T,cas=0;
scanf("%lld",&T);
while(T--){
string s;
cin>>s;
long long ans=1;
if(s.length()>=4){
ans=a[19];
}
else{
long long x=0;
for(i=0;i<s.length();i++){
x*=10;
x+=(s[i]-'0');
}
for(i=0;i<20;i++){
if(x>=a[i]){
ans=a[i];
}
else {
break;
}
}
}
printf("Case #%lld: %lld\n",++cas,ans);
}
}