Logo Fee_cle6418的博客

博客

标签
暂无

InfOJ 愚人节比赛 2024 题解

2024-04-05 21:34:16 By Fee_cle6418

A

本题的关键是使用 Custom Test:本题的 Custom Test 会返回“expected x, found y”的信息。多试几个 $x$ 作为输出就会发现,expected 的是 $(x^2+x+1)\bmod 1004535809$。所以输出某个满足 $x\equiv x^2+x+1\pmod{1004535809}$ 的 $x$ 即可。

B

输出 infoj 第 $i$ 题是否 Hackable。如果注意到 http://119.27.163.117/blog/henbam/post/68 可以加快做题速度(这个表不全,还有一点错误,但可以告诉你 Hackable 题目的大致范围)

C

输出 QOJ Blogs (qoj.ac/blogs) 中所有公开博客的作者名字。本题的输出量比较大,如果不会写爬虫可能会浪费时间。

D

输出自己的 IP 地址。可以在个人信息页面查看。

E

按照题意模拟即可。

F

将题目中的图片直接作为代码提交,语言不重要。

G

给你两个 CF id,判断是不是同一个人。只需要关注小粉兔的回复就够了。

H

本题是找规律题。

Subtask 1:给定 $a,b$,设 $a_1=a,a_2=b,a_i=a_{i-1}+a_{i-2}\ (i\ge 3)$,输出 $a_n\bmod (10^9+7)$。

Subtask 2:给定 $a,b$,设 $a_1=a,a_2=b,a_i=\frac 1ia_{i-1}+2a_{i-2}\ (i\ge 3)$,输出 $a_n\bmod (10^9+7)$。

Subtask 3:给定 $a,b$,设 $a_1=a,a_2=b$,$a_i,a_{i-1},a_{i-2}$ 满足 https://www.luogu.com.cn/article/p4pq1cal 的递推式。求 $a_k\bmod (10^9+7)$。

I

“保证最终评测时,你的对手不是我们写的的交互库,而是真实存在的对手。”那真实存在的对手是谁呢?结合标题“我这个坏东西”,可知对手实际上是自己。

所以,对手的选择和你的选择总是一样的。这时应该一直选 1。

J

本题中,你输出的数必须距离之前的人输出的数有一定距离,所以越先提交越容易过。

infoj 愚人节比赛 2024!!!

2024-03-25 12:27:06 By Fee_cle6418

4 月 5 号晚上 7 点 infOJ 愚人节赛,IOI 赛制。

出题组成员为:@feecle6418,@gyh20,@dottle,@123456787,@rsy。

过题也不可参与抽奖送 dottle bot 源代码,小粉兔垃圾桶,Anton 立牌/海报。欢迎来玩~

http://119.27.163.117/contest/27/register

本次比赛计入 rating,rating 跌涨幅度为普通比赛 八分之一。

infoj qq 群:324364809

InfOJ 维护公告

2024-02-07 17:02:49 By Fee_cle6418

从 2 月 7 日 17 时至另有通知时止,infoj 将处于维护状态,可能出现访问不稳定等情况,希望您理解。

InfOJ 愚人节比赛 2023 题解

2023-04-05 23:14:56 By Fee_cle6418

A

输出 infoj 注册时间。注册时间可以在个人主页查看。

upd:已经重测并更新 rating。

B

当 $n\le 10^7$ 时,直接 sort 排序即可。

否则,$n=\max a_i$,而 $a_i$ 互不相同,都为正整数。这意味着 $a$ 是一个排列,故对于 $i=1\to n$ 依次调用 report_val(i) 即可。

C

显然 $1,2,\dots,n$ 是最短哈密顿回路。

D

输出 infoj 第 $i$ 题的时限。

E

输出 infoj 第 $i$ 题的点赞数。然而,点赞数是会变的。

time back 意味着要回溯时间。故去 web archive 上搜索,发现恰有一个 infoj problem list 第一页的存档,与样例输出符合。故据此输出即可通过。

F

将样例中的点画在 geogebra 三维计算器里,直接用默认视角,不要旋转视角。

这样,就可以看出每个样例的点组成的都是有意义的“画”,分别是

x

+

sin y

-sqrt(|z|)

故答案是 $x+\sin y-\sqrt{|z|}$。

G

Yet another copied problem 的做法是在下发文件里找到答案,而本题的题面明白地告诉你,我们也是已经把答案下发给你了。我们的用词是“数据发给你了”,这意味着你直接下载本题数据就行。

而 updated 提示你去看 infoj 更新日志,可以发现 2 月 14 日的更新里,给出了数据下载链接。

把数据下下来之后……还不能过!infoj 代码长度限制 50kb,但输出有 100kb,需要压缩一下。

H

输出 rand() 在没有 srand 时的值。

注意,你不能直接返回 rand(),因为这个题的交互库把他污染了。你需要在别的题里用 custom test 得到答案。

I

坏东西不会让你过的。

J

交一份空代码即可。不需要过编译。

InfOJ 愚人节比赛 2023!!!!

2023-04-03 21:55:56 By Fee_cle6418

4 月 5 号 infOJ 愚人节赛,IOI 赛制。

主要出题人 feecle6418,感谢 gyh20,dottle,rsy 的指导。

过题也不可参与抽奖送 dottle bot 源代码,小粉兔垃圾桶,Anton 立牌/海报。欢迎来玩~

http://119.27.163.117/contest/23/register

本次比赛计入 rating,rating 跌涨幅度为普通比赛 八分之一。

infoj qq 群:324364809

InfOJ Round 2 题解

2023-04-03 21:55:09 By Fee_cle6418

本次比赛中,ABD 的代码长度均不超过 800 byte,是当之无愧的小清新比赛!

A

先考虑 $B=2$。首先,二进制表示全部是 1 的数肯定全都是满足要求的。

还有什么数可能满足要求?注意到,如果二进制表示里只有一位不是 1,也是满足要求的。

而容易发现只有这两种数满足要求,直接计算即可。

推广,当 $B$ 任意时,容易发现 x(B-1)(B-1)(B-1)(B-1)(B-1) 满足要求,并且把其中任意一个 $B-1$ 换成 $B-2$ 也满足要求。

怎么计算满足要求的数 $x$ 的个数呢?

  • 如果 $x$ 的位数小于 $n$ 的,都满足要求,容易直接 $O(1)$ 计算。
  • 如果 $x$ 的位数等于 $n$ 的,但是首位小于 $n$,也满足要求,容易直接 $O(1)$ 计算。
  • 如果 $x$ 的位数等于 $n$,首位等于 $n$,找到 $n$ 除了首位之外最长的一段 $B-1$,如果 $B-2$ 在这之前都可以;还要特判一下恰好在分界这里可不可以。

时间复杂度 $O(\log n)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> ve;
const int mod=998244353;
ll n,B,a[70];
void Solve(){
    scanf("%lld%lld",&n,&B);
    ll tn=n,ans=0;
    int s=0;
    while(tn)a[++s]=tn%B,tn/=B;
    for(int i=1;i<s;i++)ans+=(B-1)*i;
    ans+=(a[s]-1)*s;
    int lst=0;
    for(int i=s-1;i>=1;i--){
        if(a[i]<B-1){
            lst=i;
            break;
        }
    }
    if(lst==0)ans+=s;
    else {
        ans+=s-1-lst;
        if(a[lst]==B-2){
            bool ok=1;
            for(int i=lst-1;i>=1;i--)if(a[i]<B-1)ok=0;
            if(ok)ans++;
        }
    }
    cout<<ans<<'\n';
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--)Solve(); 
}

B

这题曾经想放进我和 gyh 出的月赛。但是好像因为结论过于简单而且可以用各种方法得出换掉了。

结论是:设 1 的位置为 $a_1,\dots,a_m$,若 $(n-a_i)$ 的异或和为 0 则后手赢否则先手赢。

首先给序列做前缀和(把原序列看成差分,那么在新序列上的操作就是区间异或),游戏变为:

  • A,B 轮流作如下操作:选择一个位置 $i\ (i

我们断言,这个游戏的结果等价于以下游戏:

  • A,B 轮流作如下操作:选择一个位置 $i\ (i减一、$a_{i+1}\sim a_j$ 都加上一(这时序列不一定总是 01 序列了)。不能操作的人输。[游戏 2]

证明:注意到在游戏二中每一单位 $a_i$ 是独立的(把 $a_i$ 看成 $n$ 堆石子分别的石子数,则一个石子的操作不影响另一石子),所以游戏可以看成 $\sum a_i$ 个游戏的和。所以游戏的 SG 是每个石子的单位游戏的 xor。所以把游戏二中的 $a_i$ 在 mod 2 意义下操作不影响结果。所以游戏二等价于游戏一。

那么只需要解决游戏二。可以归纳证明在第 $i$ 堆石子里的一颗石子 SG 值等于 $lowbit(n-i)$,那么整个题就化为(注意,最开始给的是差分):

  • 给出某些区间 $[l,r]$,求 $lowbit(l)\sim lowbit(r)$ 的异或。

容易在 $O(m\log n)$ 时间内求出,已经可以过了。

进一步讨论可以发现这就等价于最开始的结论(留作练习)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m;
ll n;
void Solve(){
    cin>>n>>m;
    assert(2<=m),assert(m<=n),assert(m%2==0);
    ll sum=0,x,lst=0;
    for(int i=1;i<=m;i++)scanf("%lld",&x),sum^=n-x,assert(x>lst),assert(x<=n),lst=x;
    if(!sum)puts("TIN");
    else puts("NIT");
}
int main(){
    int t;
    cin>>t;
    while(t--)Solve();
}

C

当然,经过很多常数优化的标程能在时限(5s)内跑出所有数据。但是作为参赛者,你不需要关心常数!理论上,只要有一个能在合理时间内(几分钟)跑出来的做法,就能 AC 这道题,因为可以写个高精度,预处理所有答案不取模的值,然后打表。所以我们的目标就是得到一个做法,不关心时间复杂度。

考虑设计一个暴力 dp。设 $f(n,m,l,r)$ 表示有多少个符合要求的长度为 $n$ 的排列的 $m$ 元组,且逆序对数在 $[l,r]$ 之间,且逆序对数最小的恰好有 $l$ 个逆序对。转移时,将这 $m$ 个排列按照第一个元素划分为 $n$ 段,枚举每段的分界线位置的排列有几个逆序对,可以再用一个 dp 来合并。

标程的实现是 $O(n^{10}m^3)$ 的。(这个复杂度酷炫!)

感谢验题人 @Alex_Wei 的加强,他给出了一种 $O(n^8m^2)$ 的实现。

下面是标程。

#include <bits/stdc++.h>
using namespace std;
using ull = unsigned long long;
using L = __uint128_t;
constexpr int N = 15 + 5;
constexpr int M = 30 + 5;
constexpr int I = 110 + 5;
int n, m, mod, f[N][M][I][I];
struct FastMod {
  ull b, m;
  FastMod(ull b): b(b), m(ull((L(1) << 64) / b)) {}
  ull reduce(ull a) {
    ull q = ull((L(m) * a) >> 64), r = a - q * b;
    return r >= b ? r - b : r;
  }
};
void add(int &x, int y) {x += y, x >= mod && (x -= mod);}
int main() {
  #ifdef ALEX_WEI
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
  #endif
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> n >> m >> mod;
  FastMod F(mod);
  if(mod == 1) puts("0"), exit(0);
  f[1][1][0][1] = 1;
  for(int i = 2; i <= n; i++) {
    int iv = i * (i - 1) / 2 + 1;
    static int s[M][I][I];
    memset(s, 0, sizeof(s));
    for(int c = 1; c < m; c++)
      for(int r = 1; r <= iv; r++)
        for(int l = 0; l <= r; l++) {
          s[c][r][l] = f[i - 1][c][l][r];
          if(l) add(s[c][r][l], s[c][r][l - 1]);
        }
    for(int l = 0; l < iv; l++) {
      static int g[M][I], h[M][I];
      memset(g, 0, sizeof(g));
      memset(h, 0, sizeof(h));
      g[0][l] = h[0][l] = 1;
      for(int j = i - 1; ~j; j--) {
        for(int c = 0; c < m; c++)
          for(int k = 0; k < iv; k++)
            if(g[c][k])
              for(int d = 1; d + c <= m; d++)
                for(int r = max(j + 1, k + 1); r <= iv; r++) {
                  int coef;
                  if(c) {
                    coef = s[d][r - j][r - j];
                    if(k > j) add(coef, mod - s[d][r - j][k - j - 1]);
                  }
                  else {
                    if(k < j) continue;
                    coef = f[i - 1][d][k - j][r - j];
                  }
                  if(coef) add(h[c + d][r], F.reduce(1ll * g[c][k] * coef));
                }
        memcpy(g, h, sizeof(g));
      }
      for(int c = 1; c <= m; c++)
        for(int r = 1; r <= iv; r++)
          f[i][c][l][r] = g[c][r];
    }
  }
  for(int u = 1; u <= n; u++) {
    for(int t = 1; t <= m; t++) {
      int ans = 0;
      for(int l = 0; l < I; l++)
        for(int r = l + 1; r < I; r++)
          add(ans, f[u][t][l][r]);
      cout << ans << " ";
    }
    cout << "\n";
  }

  return 0;
}

D

这个题出题的时候是找规律找出来的,但我一直不会证明。

答案等于 $$ \dfrac{\prod_{S\ne \varnothing,S\subseteq \{1,2,\dots,n\}}\left(\sum_{i\in S}a_i\right)^{\prod_{i\in S}(a_i-1)}}{\prod a_i} $$ 某一天我在浏览集训队论文的时候,发现 2020 年潘佳奇论文里的一个结论直接就证明了上述公式!读者可以参考《浅谈线性代数与图论的关系》中例题 5.4.2。

具体地,我们给出的超立方体上的图,实际上是 $n$ 张完全图,分别为 $a_1,\dots,a_n$ 个点,的 Cartesian 积。而它的生成树个数,就等于 Laplace 矩阵所有非零特征值的积除以点数。而 Cartesian 积 Laplace 矩阵的特征值,就是每个图的特征值集合里取一个相加的所有可能值。注意 $x$ 个点完全图 Laplace 矩阵 的特征值集合就是一个 $0$,$x-1$ 个 $x$,这就证明了上述结论。

容易用背包计算上面的式子(体积是 $\sum a_i$,价值是 $\prod (a_i-1)$),注意背包算的是指数和,应该对 $mod-1$ 取模。时间复杂度 $O(n^2\max a_i)$。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef array<ll,2> pr;
typedef vector<int> ve;
const int mod=998244353;
int n,f[500005],prod=1,s=0;
int Power(int x,int y){
    int r=1;
    while(y){
        if(y&1)r=1ll*r*x%mod;
        x=1ll*x*x%mod,y>>=1;
    }
    return r;
}
int main(){
    cin>>n,f[0]=1;
    for(int i=1,x;i<=n;i++){
        cin>>x,prod=1ll*prod*Power(x,mod-2)%mod;
        for(int j=s;j>=0;j--)f[j+x]=(f[j+x]+1ll*f[j]*(x-1))%(mod-1);
        s+=x;
    }
    for(int i=1;i<=s;i++)prod=1ll*prod*Power(i,f[i])%mod;
    cout<<prod;
}

InfOJ Beginner Round 3 题解

2023-04-03 21:54:16 By Fee_cle6418

A

暴力枚举每个数的倍数统计答案。即,对每个数 $x$,对每个 $x|y$,$cnt_y$ ++,最后输出 $cnt=i$ 的数的个数。

期望时间复杂度 $O(n\log V)$。

根据 $P(x\ge kE(x))\le \dfrac{1}{k}$ 可以推出在本题数据组数(六组极限数据)下,存在一组数据使得上面算法对 $cnt$ 执行操作次数超过 $10^7$ 的概率 小于 $0.01$。

而又因为只生成了一次数据,所以正确率是比较大的。实事求是地讲,这样做在数据下确实也不会超时。

B

把需要得到的排列拆成环。

对于一元环,不进行任何操作。对于 $k$ 元环,可以用 $k+1$ 次操作归位。

2 3 1 0
2 3 0 1
2 0 3 1
0 2 3 1
1 2 3 1

由于 $k$ 元环数不超过 $0.5n$,所以总操作次数小于等于 $0.5n+n$。

C

对每个前缀做单调栈,最小值、最大值的单调栈均维护出来。

容易发现,两个单调栈内元素总个数 $\le 4000$,可以 $O(nV)$ 枚举每个元素,计算这段位置上最小值、最大值分别是多少。

得到以上信息后做一个二维前缀和即可。

时间复杂度 $O(nV+V^2+q)$。$nV$ 部分常数特别小,时限也给得很大,应该能无压力过。

(其实用不着单调栈也可以做到同样复杂度!)

D

考虑枚举乘积部分的 $a_i,j,a_k$,求出有几种 $(i,k)$ 能满足要求。实际上 $i,k$ 满足条件的都是一段区间,所以这就是求,有多少个 $x\in [l_1,r_1],y\in [l_2,r_2]$ 使得 $x+y=z$。这是容易 $O(1)$ 计算的。

设 $m=n+\max a_i$,时间复杂度 $O(m\log^2 m)$。

E

考虑用三进制凑 $X$。

所有正整数可以唯一表示成 $\sum 3^ia_i$ 的形式,$a_i\in\{-1,0,1\}$。

每个 $3^x$ 放两个在 $a$ 里,一共用了 $2\times \log_310^9=38$ 个元素。

如果 $X/2$ 的表示中 $a_i=1$,$2i-1,2i$ 两个位置就填 ++;如果 $X/2$ 的表示中 $a_i=0$,$2i-1,2i$ 两个位置就填 +-;如果 $X/2$ 的表示中 $a_i=-1$,$2i-1,2i$ 两个位置就填 --

InfOJ Beginner Round 1 题解

2023-04-03 21:52:32 By Fee_cle6418

A

直接输出 $90-x$ 即可,注意整形溢出,要开 long long。

B

答案为 $(1+p^{a_1})(1+p^{a_2})(1+p^{a_3})\dots(1+p^{a_n})$。

理解方式:

  • 加入一个重量为 $k$ 的物品后,可以不放入背包(价值和不变),可以放入背包(价值和乘上 $p^k$),所以应该乘上 $(1+p^k)$。
  • 在生成函数角度下看,式子是显然的(

C

正难则反,记录积小于等于 $m$ 的方案数。

可以背包,设 $f_{i,j}$ 为前 $i$ 个物品积为 $j$ 的方案数,复杂度 $O(\sum \dfrac{m}{a_i})$。

把相同的 $a_i$ 一块用组合数转移就能严格 $O(n\log n)$。常数很小。

D

直接 dfs,随便乱写就有 75。

考虑精细实现,每个位置保证只试探一次,就能 AC,可以证明操作次数不超过 $2n^2$。

E

一个有趣的 trick(我自己想出来的)

$O(n\log^2 n)$ 的实现很多,也比较傻逼

直接长剖,对每条链上每个深度开线段树,合并的时候线段树合并就行了,稍微注意下实现就是一个 log 的

InfOJ Round 1 题解

2023-04-03 21:50:24 By Fee_cle6418

A

难度:橙

算法一

直接爆搜,复杂度 $O(4^nn^4)$,期望得分 $2$。

算法二

我们来找找规律呢:欸怎么 $n>2$ 输出都是 $0$ 啊?

于是直接判断,$n\le 2$ 输出 1,否则输出 $0$。期望得分 $100$。

事实上可以简单地证明 $n>2$ 时答案都是 $0$。

一个长度大于 $2$ 的串,一定存在一个数字($7$ 或 $9$)出现次数大于 $1$。那么,令 $l_1=r_1=pos_1,l_2=r_2=pos_2$,得到的 gcd 一定等于这个数字。因此,我们把某个串中所有满足 gcd 为 7 和 9 的长度为 1 的区间对拿出来组成两个集合,这两个集合就可以唯一确定这个串。

B

难度:绿

Q:为什么暴力分这么高?

A:这题相对第一题来说比较难,暴力分放多一点比较良心。

Q:为什么我写正解得了 0 分,每个 Subtask WA 1~2 个点?

A:你可能没特判操作次数没用完时已经排好序了的情况。试试这组数据:

input:
2 1
1 2
output:
2 1

算法一

枚举所有可能的最终排列,再判断能否恰好交换 $K$ 次得到,可以先求最小交换次数,然后看奇偶性。复杂度 $O(n!)$,期望得分 $30$。

$K=10^{12}$ 那答案要么是 $1,2,...,n$ 要么是 $1,2,...,n,n-1$,只需要判逆序对数的奇偶性。复杂度 $O(n^2)$ 或 $O(n\log n)$,期望得分 $45$。

算法二

从前往后贪心。

设当前位置为 $i$,已经确定了 $1\sim i-1$ 位置字典序最小的答案,现在还剩 $m$ 次操作。那找到 $[i,\min(i+m+1,n)]$ 区间内的最小元素,把这个元素交换至 $i$。

假如已经交换成 $1\sim n$ 了操作还有剩余:剩偶数次则无影响,剩了奇数次就要交换 $n-1,n$。

暴力找区间最小元素,时间复杂度 $O(n^2)$,期望得分 $75$。

算法三

注意到“把这个元素交换至 $i$”其实相当于区间剪切,把 $[i,p-1],[p,p]$ 变成 $[p,p],[i,p-1]$,可以用平衡树维护。再维护个区间最小值及其位置即可。也可以用权值线段树 / 树状数组维护,不过因为出题人写的平衡树,时限开得很大。

时间复杂度 $O(n\log n)$,期望得分 $100$。

C

难度:紫

算法一

当 $n\le 10^5$ 时,可以枚举行,问题转化为求 $1\sim R$ 的 $k$ 进制下异或和(前缀和相减即可)。这可以按位统计,$O(\log R)$ 求出。复杂度 $O(n\log nm)$,期望得分 $18$。

计算过程中可能会爆 long long,最好开上 __int128。

算法二

$nm$ 总体很小,考虑设置阀值分类讨论。

若 $n\le B$,使用算法二。

否则,枚举列,按位考虑,考虑第 $a$ 位,相当于求

$$\sum_{i=l}^r \dfrac{im+j}{K^a}\ \mathrm{mod}\ K$$

类欧即可。

时间复杂度 $O(\max(B\log nm,\dfrac{nm}{B} \log^2 nm))$,当 $B=O(\sqrt{nm\log nm})$ 时最优,为 $O(\sqrt{nm}\log^{1.5}nm)$。

第二个 Subtask 可直接实现,第一个、最后一个 Subtask 需要取模优化,而且需要选手处理 long long 的溢出,细节非常多,因此只放了 39 分 (时限还是开到了 std 两倍以上,常数较好的话可能不优化也可以过) 洛谷总时限太小,导致必须卡常数,建议去 InfOJ 提交。

D

难度:紫

算法一

暴力枚举所有情况。复杂度 $O(2^nn)$,期望得分 $1$。

可以 dp,设 $f_{i,S}$ 为前 $i$ 个字符,最后 $k$ 个字符形如 $S$ 的方案数,转移显然。时间复杂度 $O(n2^k)$,期望得分 $9$。

算法二

使用矩阵快速幂优化上面的 dp。

结合实现精细程度和 $a=0$ 情况,可以得到 $12\sim 52$ 分不等。

时间复杂度 $O(8^k\log n)$。

算法三

使用 BM 算法求出 $k,a$ 固定时 $ans_n$ 的最短递推式。

经过打表验证,$k\le 14$ 时最短递推式长度不超过 $4719$。结合常系数齐次线性递推的 $O(m\log m\log n)$ 算法(其中 $m=4719$),可以做到 $O(m^2+m\log m\log n)$ 的复杂度(单组数据)。

视线性递推算法实现可以获得 $64\sim 100$ 分。

本题对常数没有太多要求,std 完全不卡常。

InfOJ Round 2 公告

2023-01-19 16:38:25 By Fee_cle6418

InfOJ Round 2 将在 2023 年 2 月 3 日下午 14:00 举行。

比赛基本信息:

  • 出题人:@feecle6418
  • 时长:240 分钟
  • 题目数量:4 题
  • 题目描述均不超过十行!出题人也是厌倦超长题目背景的选手。
  • 难度:普及到省选。

奖励:

  • 各题首 A 奖励 $2,6,6,6$ 元。
  • 排名 $1\sim 5$ 名奖励 $10,7,5,3,1$ 元。若同分则平分。
  • AK 者额外奖励 $10$ 元。

本次比赛在 infoj 上 rated。

We are looking forward to your participation!

共 26 篇博客