T1
解题思路
这似乎是小学数学知识???mod 9就相当于各位之和mod 9,打表求了个逆元,等差数列求和公式就行了。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; typedef long long LL; inline LL rd(){ LL x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } LL l,r; int q; int main(){ scanf("%d",&q); while(q--){ l=rd(),r=rd(); printf("%lld\n",(r-l+1)%9*(l%9+r%9)%9*5%9); } return 0; }
T2
解题思路
最短路,求出哈利在1点与T1点到其他点的最短路,再求出罗恩在一点与T1点到其他点的最短路,然后分类讨论就行了。
// luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int MAXN = 50005; const int MAXM = 100005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n,m,head[MAXN],cnt,k,T1,T2,ans; int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1]; int dis[MAXN][5]; //dis[x][1] 哈利1 dis[x][2] 罗恩1 dis[x][3] 哈利x dis[x][4] 罗恩x bool lim[MAXN],vis[MAXN]; queue<int> Q; inline void add(int bg,int ed,int w){ to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt; } void spfa_Harry(int st,int now){ memset(vis,false,sizeof(vis)); dis[st][now]=0;Q.push(st);vis[st]=1; register int x,u; while(!Q.empty()){ x=Q.front();Q.pop();vis[x]=0; for(register int i=head[x];i;i=nxt[i]){ u=to[i]; if(dis[x][now]+val[i]<dis[u][now]){ dis[u][now]=dis[x][now]+val[i]; if(!vis[u]){vis[u]=1;Q.push(u);} } } } } void spfa_Ron(int st,int now){ memset(vis,false,sizeof(vis)); dis[st][now]=0;vis[st]=1;Q.push(st); int x,u; while(!Q.empty()){ x=Q.front();Q.pop();vis[x]=0; for(register int i=head[x];i;i=nxt[i]){ u=to[i];if(lim[u]) continue; if(dis[x][now]+val[i]<dis[u][now]){ dis[u][now]=dis[x][now]+val[i]; if(!vis[u]) {vis[u]=1;Q.push(u);} } } } } int main(){ memset(dis,0x3f,sizeof(dis)); n=rd(),m=rd(),k=rd();int x,y,z; for(int i=1;i<=k;i++) lim[rd()]=1; for(int i=1;i<=m;i++){ x=rd(),y=rd(),z=rd(); add(x,y,z),add(y,x,z); } T1=rd(),T2=rd(); spfa_Harry(1,1);spfa_Harry(T1,2); spfa_Ron(1,3);spfa_Ron(T1,4); ans=min(min(max(dis[T1][1],dis[T2][3]),max(dis[T2][1],dis[T1][3])) ,min(min(dis[T1][1],dis[T2][1])+dis[T2][2],min(dis[T1][3],dis[T2][3])+dis[T2][4])); cout<<ans<<endl; return 0; }