#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>#include<cstdio>#include<map>usingnamespace std;typedeflonglong ll;constint MAXN =333;const ll MOD =998244353;inlineintread(){int x =0, f =1;char c =getchar();while(c <'0'|| c >'9'){if(c =='-') f =-1;c =getchar();}while(c >='0'&& c <='9'){x =(x <<1)+(x <<3)+(c ^48);c=getchar();}return x*f;}structMatrix{
ll m[MAXN][MAXN];Matrix(){memset(m,0,sizeof m);}};
Matrix mul(Matrix a, Matrix b,int n){
Matrix ans;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){for(int k=1;k<=n;k++){
ans.m[i][j]=(ans.m[i][j]+ a.m[i][k]* b.m[k][j])% MOD;}}}return ans;}
Matrix fastpow(Matrix base,int power,int n){
Matrix ans;for(int i=1;i<=n;i++) ans.m[i][i]=1;while(power){if(power &1) ans =mul(ans, base, n);
base =mul(base, base, n);
power >>=1;}return ans;}voidextend_gcd(ll a, ll b, ll &x, ll &y){if(b ==0){
x =1;
y =0;return;}extend_gcd(b, a % b, x, y);
ll tmp = x;
x = y;
y = tmp - a / b * y;}
ll inverse_mod(ll y, ll p){
ll x, m;extend_gcd(y, p, x, m);return(p + x % p)% p;}int degree[MAXN];
ll inv[MAXN];intmain(){int t, n, m, k, u, v, w;
t =read();while(t--){
n =read();m =read();k =read();
Matrix edge, mp;for(int i=0;i<m;i++){
u =read();v =read();w =read();
edge.m[u][v]= w +1;
edge.m[v][u]= w +1;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(edge.m[i][j]==2){++degree[i];++degree[j];++degree[i + n];++degree[j + n];}elseif(edge.m[i][j]==1){++degree[i];++degree[j];++degree[i + n];++degree[j + n];}}}for(int i=1;i<=n;i++){
degree[i]>>=1;
inv[i]=inverse_mod(degree[i], MOD);
degree[i]= degree[i + n]=0;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(edge.m[i][j]==1){
mp.m[i][j]= inv[i];
mp.m[i + n][j + n]= inv[i];}elseif(edge.m[i][j]==2){
mp.m[i + n][j]= inv[i];
mp.m[i][j + n]= inv[i];}}}
mp =fastpow(mp, k,2* n);
cout << mp.m[1][2* n]<<'\n';}return0;}
样例没问题不过交在HDU上面返回TLE,标程就是这个思路,可能是评测机的问题吧,我用榜
1
1
1的代码交了也是TLE,听说用矩阵计算这里用更高级的办法能把时间优化到
500
m
s
500ms
500ms以下??
1003鸽子
设
d
p
[
i
]
dp[i]
dp[i]表示当前操作坏的电脑位置在
i
i
i的最少操作次数,那么因为当前操作是交换
i
i
i和
j
j
j,所以有
d
p
[
i
]
=
m
i
n
(
d
p
[
i
]
+
1
,
d
p
[
j
]
)
dp[i]=min(dp[i]+1,dp[j])
dp[i]=min(dp[i]+1,dp[j])
d
p
[
j
]
=
m
i
n
(
d
p
[
j
]
+
1
,
d
p
[
i
]
)
dp[j]=min(dp[j]+1,dp[i])
dp[j]=min(dp[j]+1,dp[i])
很容易理解,注意更新不要覆盖
#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>#include<cstdio>#include<map>usingnamespace std;typedeflonglong ll;constint MAXN =2e5+100;constint INF =0x3f3f3f3f;int Data[MAXN];int dp[MAXN];intmain(){
ios::sync_with_stdio(false);int t, n, m, k, u, v;
cin >> t;while(t--){
cin >> n >> m >> k;memset(dp,0x3f,sizeof dp);
dp[k]=0;for(int i=1;i<=m;i++){
cin >> u >> v;int a = dp[u];int b = dp[v];
dp[v]=min(b +1, a);
dp[u]=min(a +1, b);}for(int i=1;i<=n;i++){if(i !=1) cout <<' ';
cout <<(dp[i]== INF ?-1: dp[i]);}cout <<'\n';}return0;}
1004萌新
已知
a
a
a和
b
b
b模
c
c
c同余,给定
a
a
a和
b
b
b,让求
c
c
c的最小和最大值,满足
c
−
1
>
0
c-1\gt0
c−1>0且
c
≤
m
a
x
(
a
,
b
)
c\leq max(a,b)
c≤max(a,b)
现在假定
a
>
b
a\gt b
a>b,显然有
a
−
b
=
k
c
a-b=kc
a−b=kc,那么c最大时候显然是
k
c
kc
kc也就是
a
−
b
a-b
a−b,但是这里需要注意两种特殊情况分别是
a
−
b
=
1
a-b=1
a−b=1和
a
−
b
=
0
a-b=0
a−b=0;当求c最小的时候只需要枚举
a
−
b
a-b
a−b的每个因子,找到最小即可,但是需要注意特判
a
=
1
,
b
=
1
a=1,b=1
a=1,b=1的两种情况
#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<cmath>#include<cstdio>#include<map>usingnamespace std;typedeflonglong ll;constint MAXN =2e5+100;constint INF =0x3f3f3f3f;int Data[MAXN];intmain(){
ios::sync_with_stdio(false);int t;
ll a, b;
cin >> t;while(t--){
cin >> a >> b;if(a < b)swap(a, b);
ll c = a - b;if((a ==1&& b ==1)|| c ==1){
cout <<-1<<" "<<-1<<'\n';continue;}if(a == b){
cout <<2<<" "<< a <<'\n';continue;}int f =0;for(ll i=2;i*i<=c;i++){if(c % i ==0){
cout << i <<" ";
f =1;break;}}if(f) cout << c <<'\n';else cout << c <<' '<< c <<'\n';}return0;}