阶乘数码#洛谷

题目描述

n!n!n! 中某个数码出现的次数。

输入格式

第一行为 t(t≤10)t(t \leq 10)t(t10),表示数据组数。接下来 ttt 行,每行一个正整数 n(n≤1000)n(n \leq 1000)n(n1000) 和数码 aaa

输出格式

对于每组数据,输出一个整数,表示 n!n!n!aaa 出现的次数。

样例 #1

样例输入 #1

2
5 2
7 0

样例输出 #1

1
2
def work(data):
    anss=1
    for i in range(1,data+1):
        anss*=i
    return anss


if __name__=="__main__":
    num = int(input())
    for item in range(num):
        n, a = map(int, input().split())
        mapp=work(n)
        srt=str(mapp)
        value=srt.count(str(a))
        print(value)

最近两天考试,用py精度之王水一篇,保持个博客量。考完试好好做

<think>根据用户需求,我们需要编写一个C++程序,计算n!(n的阶乘)中指定数码a(0-9)出现的次数。 输入格式:第一行是数据组数t,接下来t行,每行一个正整数n和一个数码a。 输出格式:对于每组数据,输出n!中数码a出现的次数。 注意:n可能比较大,阶乘结果可能会非常大,因此不能直接计算阶乘的数值(容易溢出),而是需要计算阶乘中每个数位上各个数码出现的次数。 但是,如果我们直接计算阶乘,数值可能会超过普通整数类型(甚至unsigned long long)的范围,所以我们需要采用其他方法。 思路:我们可以通过计算阶乘的质因数分解中2、5等因子的个数来避免直接计算大数,但这里需要统计的是十进制表示中数码出现的次数。 因此,我们需要模拟大数阶乘的计算过程,同时记录每个数位上的数字以及数码出现的频次。然而,由于n可能很大,模拟大数乘法可能会比较耗时,但题目要求的数据组数t没有给定范围,我们需要考虑效率。 另一种思路是:统计每个数码在所有数位上出现的次数。我们可以分开每个数位来统计该数位上是某个数码的贡献。 但是,阶乘阶乘级增长会使这种方法也很复杂。 鉴于数据组数t不会太大(一般t<=1000),而n最大可能达到几百或几千(题目未明确,但考虑到阶乘增长速度,n太大无法计算),我们需要权衡。 具体方法: 方法1:使用数组模拟大数乘法,计算出n!的每一位数字,然后统计指定数码出现的次数。这种方法在n较大时(比如1000!)会需要很大的数组,并且乘法效率较低,但可以完成任务。 方法2:使用数学公式(如Kummer定理)来统计阶乘数码的出现次数?目前没有直接公式。 由于题目需要统计的是十进制表示中数码a的出现次数,我们选择模拟大数乘法计算阶乘(用字符串或数组存储大数),然后统计结果中数码a出现的次数。 步骤: 1. 预定义一个足够大的数组来表示大数,初始化为1(表示0!或1!)。 2. 对于每个测试数据,计算n!: 初始化一个数组(或字符串)num,num[0]=1,表示阶乘的初始值(1),然后从2乘到n。 每次乘法:将当前数组表示的大数乘以k(k从2到n),进位处理每一位。 3. 计算完n!后,统计这个大数中数码a出现的次数。 4. 输出结果。 注意:由于有t组数据,如果每组数据都重新计算n!,那么当t很大且n也很大时,效率会很低。我们可以考虑对每组数据独立计算,因为每组数据的n可能不同。 优化:如果同一个n被多次查询,我们可以缓存结果(但题目并未说明n会重复,且每组数据都有不同的n和a,因此缓存按n缓存阶乘结果,但还要考虑不同的a,所以直接每组独立计算更简单)。 但是,如果n很大(比如1000),那么1000!大概有2568位(通过斯特林公式估计),所以数组大小可以设为10000(以防多个测试用例中n较大)。 具体实现: 我们将大数用一个动态数组(vector)来存储,或者用固定大小的数组(比如100000位)。考虑到多组数据,每组数据都要进行一次阶乘计算,我们可以这样: 对于每组数据(n, a): 初始化一个vector digits,用于存储阶乘结果(逆序存储:低位在低地址,高位在高地址)。 digits[0] = 1; // 初始为1 int size = 1; // 当前位数 然后从2到n循环: 进行大数乘法:将当前大数(存储在digits中)乘以i(当前乘数),同时处理进位。 乘法完成后,我们得到了n!的逆序存储(例如,5! = 120,则digits存储为[0,2,1])。 然后,遍历整个digits数组,统计其中a出现的次数(注意:a是数码0-9,但存储的是整数,所以直接比较整数)。 注意:在数组中,低位在低索引位置,高位在高索引位置(所以要统计整个数组)。 但是,当n=0时,0! = 1,要注意。 输入数据组数t,然后循环t次,每次读入n和a,然后计算该组。 由于n可能很大,所以我们需要考虑时间效率。例如,当n=1000时,需要做1000次大数乘法(每次乘法需要遍历大数的每一位,且大数的位数会随着乘法逐渐增加),所以总的时间复杂度大概为O(n^2)(粗略估计,因为位数大约是O(n log n))。如果t很大(比如1000),而n也很大(比如1000),那么总操作次数大约是1000 * (1000^2) = 10^9,可能会超时(在C++中,10^9操作在普通计算机上可能需要几秒,但如果n更大则不行)。 因此,我们需要考虑是否有更高效的方法? 另一种思路:使用数位分解的方法。但阶乘中某个数码出现次数没有直接的公式。已有的方法是使用大数乘法计算阶乘,然后统计。 考虑到题目没有给出n的范围,但一般来说,n最大可能到10000(此时阶乘位数约为35660位),而乘法次数为10000次,每次乘法需要乘以一个整数(最大10000)并处理进位,每次乘法的操作次数为当前大数的位数(最后位数约为35660),那么总操作次数约为10000 * 35660 = 356e6,即3.56亿次操作,在C++中可能可以在1秒内完成(单组数据)。但如果有t=1000组,那么总操作次数将非常大(3.56e9 * 1000? 不对,因为每组数据n不同,最坏情况是每组都是大n,那么就是1000次独立的大数阶乘计算,每次3.56亿次,总操作次数3560亿次,显然超时)。 因此,我们需要优化。我们可以预先计算一个阶乘表,即计算到最大n的阶乘(然后存储成字符串数组),然后对于每组查询,直接查表并统计数码。这样,我们只需要计算一次最大n的阶乘。但是,题目中每组数据的n不同,且a也不同,但我们可以预先计算所有可能n的阶乘(只要知道最大n即可)。然而,题目没有给出n的范围,所以不能盲目取最大值。 优化方法:在读取数据组数t后,我们首先读入所有的n,然后找出最大n(设为max_n),然后计算0!到max_n!(存储每个阶乘结果的字符串形式),然后对于每组数据的n,直接取出对应的阶乘字符串,然后统计其中a出现的次数。 这样可以避免重复计算,但需要存储所有阶乘结果(字符串)。由于max_n可能很大(比如10000),那么阶乘字符串的长度约为35660,存储max_n个阶乘字符串需要大约10000*35660字节=356.6MB,可能超过内存限制。 因此,我们考虑不存储所有的阶乘,而是只计算到最大n的阶乘,然后依次处理每组数据:按n从小到大排序,然后依次计算阶乘(从上一个阶乘开始乘到当前n),然后统计该组数据的数码a。这样,我们只需要存储当前阶乘的结果,然后统计后丢弃(因为下一组需要用到当前阶乘结果才能计算下一个阶乘?但要求输出顺序与输入顺序一致,所以不能打乱顺序)。 所以,我们可以: 1. 读入所有的t组数据,存储到一个数组(每个元素是pair(n,a)和原始序号)。 2. 按照n从小到大排序。 3. 初始化大数(当前阶乘值)为1(n=0或1)。 4. 设置当前阶乘值对应的n_current = 1。 5. 遍历排序后的每个查询(按n从小到大): 如果当前查询的n大于n_current,则从n_current+1乘到n(更新大数)。 然后,用更新后的大数统计数码a出现的次数,并将结果存储在对应原始序号的位置。 6. 最后,按原始序号顺序输出结果。 这样,我们只需要计算一次从最小n到最大n的阶乘(中间递增)。但是,如果有多个相同n的查询,则不需要重复计算。 然而,题目输入是乱序的,所以我们需要记录原始序号。 步骤: 1. 读入t。 2. 创建数组data,大小为t。每个元素是一个三元组:n, a, index(索引)。 3. 对data按n进行排序(从小到大)。 4. 初始化当前阶乘值(大数)为1,当前n_current=1(因为0!和1!都是1)。 5. 创建一个结果数组result,大小为t。 6. 遍历data中的每个元素(按n从小到大): 如果当前元素的n等于0或1,则阶乘为"1"。 否则,如果n>n_current,则循环从n_current+1到n,将当前大数乘以i(并更新大数)。 然后,将当前大数转换为字符串(或者直接用这个大数数组统计数码),统计这个大数中a出现的次数(注意a是字符,但大数数组中存储的是整数,需要转成字符?实际上,我们可以直接比较整数和a(a是数字字符,需要转成整数?))。 注意:输入中的a是整数数码(0-9),我们用整数表示,所以在统计大数数组时,可以直接用整数比较:如果当前位等于a,则计数++。 但是,注意大数数组的存储顺序:我们通常逆序存储(低位在低索引),但统计数码出现次数与顺序无关(只需要知道每一位是什么数字)。 然后,将统计结果存入result[data[i].index]。 7. 更新n_current为当前n(以便下一组使用)。 8. 遍历完所有排序后的数据后,按顺序输出result数组(即按输入的顺序输出)。 注意:当n=0时,0!等于1。所以也要处理。 但是,这种方法要求我们存储中间的大数(用于后续乘法),并且大数的位数可能会很长(最大n的阶乘位数约为O(n log n)),所以我们需要动态数组(vector)来存储。 另外,乘法操作:大数(用vector<int>存储,每个元素表示一位,0-9)乘以一个整数k(k<=max_n),然后进位处理。 具体乘法: vector<int> digits; // 低位在0,高位在后面 int carry = 0; for (int j = 0; j < digits.size(); j++) { int temp = digits[j] * k + carry; digits[j] = temp % 10; carry = temp / 10; } while (carry) { digits.push_back(carry % 10); carry /= 10; } 然后,统计时,遍历digits,统计等于a的个数。 但是,注意:输入中的a是整数(例如,输入5,表示数码5),所以我们直接用整数比较。 例子:5! = 120,存储为[0,2,1](低位0,高位1)。统计数码0:第一位0(索引0)是0,满足;第二位2,第三位1,所以0出现1次。 然而,注意:阶乘结果中高位的0实际上并不存在(因为我们存储时没有前导0),但统计时每个位都是有效的(包括中间的0)。所以这样统计正确。 但是,阶乘结果中不会出现前导0,因为阶乘至少是1。 实现细节: 我们使用vector<int> digits; 初始化为{1}(表示1)。 当前n_current=1(表示已经计算了1!)。 遇到第一个查询(假设n=5),则从2乘到5: 乘以2: [1] -> 1*2=2 -> [2] (size=1) 乘以3: [2] -> 2*3=6 -> [6] 乘以4: [6] -> 6*4=24 -> [4](进位2)-> 然后处理进位:push_back(2) -> [4,2](表示24) 乘以5: [4,2] -> 4*5=20,加上进位0,所以20,然后取模:20%10=0,进位20/10=2;然后下一位2*5=10+进位2=12 -> 12%10=2,进位12/10=1;然后push_back(1) -> [0,2,1] (表示120) 然后统计:当a=0时,在[0,2,1]中,0出现1次;a=2出现1次;a=1出现1次。 注意:在乘以5时,我们逐位计算: 第一位:4*5=20 -> 该位变成0,进位2。 第二位:2*5=10,加上进位2=12 -> 该位变成12%10=2,进位1。 然后进位1,添加一位1 -> 得到三位数:120。 程序结构: 步骤1:读取t,然后循环t次读入n和a,同时记录索引i(0到t-1)。 步骤2:将查询存入vector<tuple> queries,每个tuple(n,a,index) 步骤3:对queries按n排序(稳定排序,相同n保持顺序?但相同n可以复用,顺序没关系,因为结果一样,但我们需要按原始索引输出,所以记录索引) 步骤4:初始化: vector<int> digits = {1}; // 当前阶乘值 int current_n = 1; vector<int> result(t); // 存储每个查询的结果 步骤5:遍历排序后的queries(按n从小到大): for (int i=0; i<t; i++) { int n = get<0>(queries[i]); int a = get<1>(queries[i]); int idx = get<2>(queries[i]); // 如果n为0,则阶乘为1,单独处理(因为current_n初始为1,所以0可能没覆盖) // 注意:0! = 1 if (n == 0) { // 这时,阶乘结果为"1",统计1中a出现的次数(只有一位) if (a == 1) result[idx] = 1; else result[idx] = 0; continue; } // 如果n大于current_n,则从current_n+1乘到n if (n > current_n) { for (int k = current_n+1; k <= n; k++) { // 将digits乘以k int carry = 0; for (int j=0; j<digits.size(); j++) { int temp = digits[j] * k + carry; digits[j] = temp % 10; carry = temp / 10; } while (carry) { digits.push_back(carry % 10); carry /= 10; } } current_n = n; // 更新当前阶乘计算到的n } // 如果n小于current_n?由于我们按n从小到大排序,所以不会出现这种情况。 // 现在,digits存储的是n!的逆序(低位在前) // 统计digits中a出现的次数 int count = 0; for (int j=0; j<digits.size(); j++) { if (digits[j] == a) { count++; } } result[idx] = count; } 步骤6:遍历result,输出每个结果(每个结果一行)。 注意:当n=0时,我们在循环内部单独处理。为了统一,也可以将current_n初始化为0?但初始digits为{1},表示0!和1!都是1。那么当n=0时,我们跳过乘法(因为n=0小于current_n=1?)。但按上面的排序,最小的n可能是0,所以我们在循环开始前,current_n=1,那么n=0会进入单独处理(上面的if(n==0)分支)。这样处理没问题。 但是,还有一种情况:如果排序后第一组数据是n=0,那么current_n=1,然后n=0小于current_n,但我们有n==0分支处理。所以没问题。 然而,如果n=1呢?在current_n=1的情况下,n=1等于current_n,所以直接统计digits(此时digits=[1])。统计a在[1]中出现的次数:如果a=1则1次,否则0次。 但是,当n比current_n小的情况下(比如排序后,第一组是n=0,第二组是n=1,第三组是n=3,然后下一组n=2?不可能,因为我们已经按n排序了,所以n是递增的)。所以不用担心。 另外,相同n的情况:比如连续两个查询都是n=5,那么第一次遇到n=5时,计算5!,然后统计;第二次再遇到n=5时,由于current_n已经是5,所以直接统计(不需要再次计算),这样避免了重复计算。 但是,注意:排序后,相同的n会连续出现(除非相同n的查询在输入中不连续,但排序后连续),所以我们复用阶乘结果。 然而,如果输入中n的范围很大(比如最大n=5000),那么我们需要计算5000!,这个数大约有16326位(用斯特林公式:位数≈n*log10(n/e)+log10(2*pi*n)/2),所以大约16326位,然后乘以5000次(每次乘法操作位数次,即5000次乘法,每次操作位数(从1位到16326位)),总操作次数大约是5000*16326≈81.63e6(8千万次操作),在C++中应该很快(小于1秒)。然后对于每组查询,统计次数只需要遍历大数的位数(16326次),而总共t组,但每组只需要统计一次(相同n的查询会连续,所以相同n的查询只需要统计一次?不对,每个查询都要统计,但同一个n的阶乘结果已经计算好,统计很快)。 但是,如果t很大(比如10000组),而n都相同(比如都是5000),那么我们需要对同一个阶乘结果统计10000次(每次遍历16326位),那么总操作次数10000*16326≈163e6,1.6亿次,也可以接受。 因此,我们按上述方法实现。 但是,还有一种特殊情况:当a=0时,阶乘结果中最高位的前导0不会被存储(因为我们存储时没有前导0),所以不用担心前导0。但中间和末尾的0都会被正确统计。 另外,阶乘结果中,末尾可能会有很多0(因为因子2和5),但我们的存储方法(低位在前)会将末尾0放在数组的前面(比如5!的120,存储为[0,2,1]),这样统计0时,第一个0(最低位)被统计了。 因此,实现代: 注意:输入数据中,a是整数(0-9),所以我们读入整数即可。 代示例: 由于题目要求C++,我们按照上述思路编写。 但是,注意:当n很大时,大数乘法的时间复杂度为O(当前阶乘的位数),而阶乘的位数随n增大而增大,所以总时间复杂度约为O(n^2)(n为最大n)。在n=10000时,位数约为35660,乘法操作需要10000次,每次平均位数约为17830(从1到35660),总操作次数约为(1+2+...+35660)*10000?不对,我们每次乘法都是乘以一个数,并且从1乘到n,所以每次乘以k时,当前位数是log10(k!)≈k*log10(k)(粗略),所以总操作次数是O(n^2)(因为每次乘法操作次数与当前位数成正比,而当前位数的总和是O(n^2))。 因此,当n很大时(比如10000),总操作次数很大(大约10^8~10^9),但实际测试,10000!的计算在C++中优化一下(比如使用int数组,每个元素存储多位(如10000进制))可以加快速度。但这里为了简单,我们每个元素存一位。 考虑到时间效率,如果n最大为10000,那么总乘法操作次数大约是:sum_{k=1}^{n} (k!的位数) ≈ 1.5 * 10^7 (位数之和大约是n^2/2 * log10(n)?不太精确,但实际测试可以接受)。 我们试试:位数大约为O(n log n),所以总操作次数为O(n^2 log n)。当n=1000时,位数大约2500,总操作次数=1000*2500=2.5e6,很快。但n=10000时,位数35660,总操作次数=10000*35660=3.56e8(3.56亿),在C++中大约需要几秒钟(如果编译器优化,可能1~2秒),而t如果很小(比如t<=100),那么总时间可以接受。 所以,我们按照上述思路编写代。如果t很大,并且n都很大,那么我们需要优化(比如存储所有阶乘结果?但内存可能不够)。所以,我们先按上述方法实现。 代实现: 注意:为了避免排序后索引丢失,我们使用结构体存储查询。 步骤: 1. 读入t。 2. 定义结构体Query:包含n, a, idx。 3. 创建vector<Query> queries,读入t组数据。 4. 对queries按n排序(使用sort,自定义比较函数)。 5. 初始化digits为{1},current_n=1。 6. 创建结果数组result(t)。 7. 遍历queries中的每个查询q: if (q.n == 0) { result[q.idx] = (q.a == 1) ? 1 : 0; } else { if (q.n > current_n) { // 从current_n+1乘到q.n for (int k = current_n+1; k <= q.n; k++) { int carry = 0; for (int j=0; j<digits.size(); j++) { int temp = digits[j] * k + carry; digits[j] = temp % 10; carry = temp / 10; } while (carry) { digits.push_back(carry % 10); carry /= 10; } } current_n = q.n; } // 统计digits中等于q.a的个数 int count = 0; for (int j=0; j<digits.size(); j++) { if (digits[j] == q.a) { count++; } } result[q.idx] = count; } 8. 输出结果:遍历result,输出每个结果(每个结果一行)。 注意:当n=0时,我们不需要阶乘计算,直接处理。 但是,初始current_n=1,那么如果第一个查询是n=0,则进入n==0分支;如果第一个查询是n=1,则直接统计(因为current_n=1,所以不会进入乘法循环);如果第一个查询是n>1,则进入乘法循环。 另外,排序后,如果第一个查询是n=0,第二个是n=5,那么计算到n=5后,current_n=5,然后第三个查询是n=3(但排序后应该是升序,所以不会出现n=3在n=5后面)。所以没问题。 下面编写代,注意细节。 但是,有一个问题:阶乘结果可能很大,但digits数组是逆序存储(低位在前),这样在统计时,每个位都是有效的(包括中间的0),所以正确。 另外,注意:当a=0时,阶乘结果中最低位(个位)可能是0(比如5!的个位是0),会被统计。同样,其他位置的0也会被统计。 测试:输入n=5, a=0,应该统计120中的0的次数:1次(个位0)。正确。 另一个测试:n=10, a=0。10! = 3628800,存储为[0,0,8,8,6,2,3](逆序,实际是3628800),其中0出现了2次(末尾两个0)。注意:我们存储的数组中,低位是0(两个0)和高位是3,所以统计数组中0的个数是2。因此正确。 代实现细节: - 使用vector<int> digits; - 初始:digits.push_back(1); - 乘法时,进位初始为0,然后逐个乘以每一位,最后处理剩下的进位。 我们开始写代。注意输入输出。 注意:输入数据组数t,然后t行,每行两个整数:n和a(0<=n<=?,但题目未给,我们假设n>=0;a是0-9的整数) 代: </think>以下是使用C++编写的程序,用于计算n!中指定数码a出现的次数。程序通过模拟大数乘法计算阶乘,并按位统计指定数字出现的次数,避免了阶乘结果溢出问题: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Query { int n, a, idx; }; int main() { int t; cin >> t; vector<Query> queries(t); for (int i = 0; i < t; i++) { cin >> queries[i].n >> queries[i].a; queries[i].idx = i; } // 按n值升序排序 sort(queries.begin(), queries.end(), [](const Query& a, const Query& b) { return a.n < b.n; }); vector<int> result(t, 0); vector<int> digits; int current_n = 1; digits = {1}; // 初始化阶乘值 1! for (const auto& q : queries) { // 处理n=0的情况 if (q.n == 0) { result[q.idx] = (q.a == 1) ? 1 : 0; continue; } // 若当前n小于查询值,计算阶乘到目标值 if (q.n > current_n) { for (int k = current_n + 1; k <= q.n; k++) { int carry = 0; for (int j = 0; j < digits.size(); j++) { int temp = digits[j] * k + carry; digits[j] = temp % 10; carry = temp / 10; } while (carry) { digits.push_back(carry % 10); carry /= 10; } } current_n = q.n; } // 统计数字a出现次数 int count = 0; for (int num : digits) { if (num == q.a) count++; } result[q.idx] = count; } // 输出结果(原始顺序) for (int i = 0; i < t; i++) { cout << result[i] << endl; } return 0; } ``` ### 程序说明 1. **输入处理**: - 第一行输入数据组数`t` - 后续`t`行每行输入`n`(阶乘基数)和`a`(目标数码0-9) 2. **核心算法**: - **大数乘法**:使用`vector<int>`按位存储阶乘结果(逆序存储,低位在索引0处) - **阶乘计算**:从当前已计算阶乘值继续乘至目标`n`值,逐步更新存储数组 - **进位处理**:每位乘法后处理进位,动态扩展数组长度 - **数码统计**:直接遍历阶乘结果的每一位统计目标数码出现次数 3. **性能优化**: - 查询按`n`值升序排序,避免重复计算阶乘 - 复用已计算的阶乘结果(如先计算5!后,后续5!查询直接统计) 4. **特殊处理**: - `n=0`时直接返回`1`(0! = 1),仅当`a=1`时计数为1 ### 示例测试 **输入**: ``` 3 5 0 10 0 7 5 ``` **输出**: ``` 1 // 5! = 120,包含1个0 2 // 10! = 3628800,包含2个0 1 // 7! = 5040,包含1个5 ``` ### 优化说明 - **时间复杂度**:$O(t \log t + n_{max}^2)$($n_{max}$为最大查询值,平方级来自大数乘法) - **空间复杂度**:$O(d)$($d$为阶乘结果的位数,约为$n \log n$量级) - **适用场景**:适用于$n \leq 10^4$量级(普通PC可在1秒内完成) ### 相关问题 1. 如何进一步优化大数阶乘的计算效率? 2. 当$n$极大时(如$n>10^6$),是否有更高效的数码统计算法? 3. 如何扩展此程序支持多进制下的数码统计? 4. 阶乘结果中数码分布的数学规律有哪些研究? 5. 是否存在无需完整计算阶乘即可统计数码的方法?[^1] [^1]: 高阶乘数码分布属于数论中的开放问题,目前尚无通用公式,但存在概率分布近似模型(如Benford定律的变体)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

直接AC好吗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值