HydroOJ-原创题.qwqwq

44 阅读1分钟

题面

题目描述

对于正整数 𝑁,令 𝑉𝑁 表示由 𝑁 重复 𝑁 次所形成的整数。更具体地,将 𝑁 视为字符串,将其复制 𝑁 次并将结果视为整数,得到 𝑉𝑁。例如,𝑉3=333,𝑉10=10101010101010101010。

求𝑉𝑁 除以 998244353998244353 的余数。

输入格式

一行一个整数 𝑁(1≤𝑁≤10^18)

输出格式

一个整数,𝑉𝑛 除以 998244353998244353 的余数

输入数据1

5

输出数据1

55555

输入数据2

9

输出数据2

1755646

思路

很明显的一道乘法逆元的题

先得到 n 的数位len,如输入数据1 V5=51+10+100+1000+10000=55555V5 = 5 *(1+10+100+1000+10000)= 55555 那么公比 q = 10^len

最终结果就是求 Vn % mod = n(1qn)/(1q)n(1-q^n)/(1-q) % mod = n(qn1)/(q1)n(q^n-1)/(q-1) % mod

结果可能会很大,用上乘法逆元引入费马小定理,最终 VnVn % mod = (n(qn1)(n(q^n-1)(q-1)^(mod-2)) % mod

Code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int fast_io=[](){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	return 0;
}();
const ll mod = 998244353;
ll ws(ll n){
	ll ans=0;
	while(n){
		ans++;
		n/=10;
	}
	return ans;
}
inline ll quick(ll b,ll p){
	ll ans=1;
	while(p){
		if(p&1)
			ans=ans*b%mod;
		b=b*b%mod;
		p>>=1;
	}
	return ans;
}
inline ll qy(ll n){
	return (n%mod+mod)%mod;
}
void qwqwq(){
	ll n,len,q,ans;
	cin >> n;
	len=ws(n);
	q=quick(10,len);
	// 费马小定理 
	ans=qy(qy(qy(n)*qy(quick(q,n)-1))*qy(quick(q-1,mod-2)));
	cout << ans;
}
int main(){
	qwqwqw();
	return 0;
}