P8116

洛谷P8116题解

题面传送门

提供一个与其他题解不同的证明方法

首先放结论

\[\large{ans = \sum_{i|b^{k-1}}1} \]

然后就是证明了

由于题目给出的是 \(b\) 进制,我们先将其转化为十进制

首先证明符合结论的状况

\[\Large\frac{1}{n}=\sum_{i=1}^{k-1}\frac{p_i}{b^i}(p_i<b) \]

两边同时乘上 \(b^{k - 1}\)

\[\Large\frac{b^{k-1}}{n}=\sum_{i=1}^{k-1}{p_i\cdot b^{k-1-i}}(p_i<b) \]

由题意可知, \(b,k,p_i\) 均为正整数,所以右式一定为整数,故左式也一定为整数

可以证明 \(n|(b-1)\)\(\exists p\) 的构造使等式成立

然后是不合结论的状况

\[\Large\frac{1}{n}=n'+\frac{p_k}{b^k} \]

\[\Large\frac{1}{n'}=\frac{1}{\frac{1}{n}-\frac{p_k}{b^k}}=\frac{n\cdot b^k}{b^k-n\cdot p_k} \]

要想证明这一状况不合题目,可以构造如下的不等式

\[\Large\frac{n\cdot b^k}{b^k-n\cdot p_k}> n+\frac{1}{b^{k-1}} \]

边界状况为 \(p_k=b\) 代入,并将式子变形可得

\[\Large n\cdot b^{k-1}>-n^2-\frac{1}{b^{k-1}}+1+n\cdot b^{k-1} \]

消去同项,移项可得

\[\Large n^2+\frac{n}{b^{k-1}}>1 \]

\[\Large\because n\in\mathbb{N_+} \]

\[\Large\therefore\texttt{该不等式恒成立} \]

由此可以推知 \(k+a(a>0)\) 的所有状况,我们就可以得出最上面的结论

\(\color{Green} {AC\quad code}\)

//coding by cxz_0
#include <bits/stdc++.h>
#define awa cerr << "xlx is my superman!!!!!!!!!!!\n";
#define FOR(x,l,r) for(int (x) = (l); (x) <= (r); (x)++)
#define _FOR(x,l,r) for(int (x) = (r); (x) >= (l); (x)--)
#define gc getchar()
#define pb emplace_back
#define mp make_pair
#define pii pair<int, int >
#define PII pair<ll, ll >
#define fi first
#define se second
#define p_q priority_queue
// #define int ll
#define il inline
using namespace std;
typedef long long ll;

const int N = 1e5 + 5,MOD = 998244353;
int b, k, v[N], p[N], tot;
namespace cxz_0
{
   il int read(int x=0,bool f=0,char c=gc){while(!isdigit(c))f=c=='-',c=gc;while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc;return f?-x:x;}
   il void write(int x){if(x<0)x=-x,putchar('-');if(x>9)write(x/10);putchar(x%10+'0');}
   il ll readl(ll x=0,bool f=0,char c=gc){while(!isdigit(c))f=c=='-',c=gc;while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=gc;return f?-x:x;}
   il void writel(ll x){if(x<0)x=-x,putchar('-');if(x>9)write(x/10);putchar(x%10+'0');}
   il int qpow(int a, int n, int p){int b=1;while(n){if(n&1)b=1ll*b*a%p;a=1ll*a*a%p;n>>=1;}return b;}
   il int max(int&a,int&b){return a>b?a:b;}
   il int min(int&a,int&b){return a<b?a:b;}
   il void swap(int&a,int&b){a^=b^=a^=b;}
   il int Mod(int x){return x>MOD?Mod(x-MOD):x;}
} using namespace cxz_0;

il void pre()
{
   FOR(i, 2, N - 5)
   {
       if (!v[i]) v[i] = 1, p[++tot] = i;
       FOR(j, 1, tot)
       {
           if (i * p[j] > N - 5) break;
           v[p[j] * i] = 1;
           if (i % p[j] == 0) break;
       }
   }
}

il void solve()
{
   b = read(), k = read();
   int cnt = 0, ans = 1;
   vector<int> v;
   FOR(i, 1, tot)
   {
       if (b % p[i] == 0)
       {
           while (b % p[i] == 0) b /= p[i],cnt++;
           v.pb(cnt);
           cnt = 0;
       }
   }
   for (auto x : v) ans = 1ll * ans * (x * (k - 1) + 1ll) % MOD;
   write(ans);
   putchar(10);
}

signed main()
{
#ifndef ONLINE_JUDGE
   double start = clock();
   freopen("T1.in", "r", stdin);
   freopen("T1.out", "w", stdout);
#endif
   pre();
   int T = read();
   while (T--) solve();
#ifndef ONLINE_JUDGE
   cerr << "Time: " << 1e3 * (clock() - start) / CLOCKS_PER_SEC << " ms" << endl;
   awa
#endif
   return 0;
}

posted @ 2022-11-18 14:18  你的洛  阅读(22)  评论(0)    收藏  举报