QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#56646#2551. Math Stringdo_while_trueAC ✓3ms3736kbC++4.2kb2022-10-20 22:09:422022-10-20 22:09:46

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2022-10-20 22:09:46]
  • 评测
  • 测评结果:AC
  • 用时:3ms
  • 内存:3736kb
  • [2022-10-20 22:09:42]
  • 提交

answer

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<random>
#include<assert.h>
#define pb emplace_back
#define mp make_pair
#define fi first
#define se second
#define dbg(x) cerr<<"In Line "<< __LINE__<<" the "<<#x<<" = "<<x<<'\n';
#define dpi(x,y) cerr<<"In Line "<<__LINE__<<" the "<<#x<<" = "<<x<<" ; "<<"the "<<#y<<" = "<<y<<'\n';
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int>pii;
typedef pair<ll,int>pli;
typedef pair<ll,ll>pll;
typedef pair<int,ll>pil;
typedef vector<int>vi;
typedef vector<ll>vll;
typedef vector<pii>vpii;
typedef vector<pil>vpil;
template<typename T>T cmax(T &x, T y){return x=x>y?x:y;}
template<typename T>T cmin(T &x, T y){return x=x<y?x:y;}
template<typename T>
T &read(T &r){
	r=0;bool w=0;char ch=getchar();
	while(ch<'0'||ch>'9')w=ch=='-'?1:0,ch=getchar();
	while(ch>='0'&&ch<='9')r=r*10+(ch^48),ch=getchar();
	return r=w?-r:r;
}
template<typename T1,typename... T2>
void read(T1 &x,T2& ...y){read(x);read(y...);}
const int mod=998244353;
inline void cadd(int &x,int y){x=(x+y>=mod)?(x+y-mod):(x+y);}
inline int add(int x,int y){return (x+y>=mod)?(x+y-mod):(x+y);}
inline void cdel(int &x,int y){x=(x-y<0)?(x-y+mod):(x-y);}
inline int del(int x,int y){return (x-y<0)?(x-y+mod):(x-y);}
int qpow(int x,int y){
	int s=1;
	while(y){
		if(y&1)s=1ll*s*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return s;
}
ll n;
namespace bf{
	const int N=1010;
	int f[N],g[N],h[N],ctf[N],cth[N],ctg[N];
	int main(){
		for(int i=1;i<=n;i++){
			h[i]=g[i]=add(g[i-1]*90ll%mod,qpow(9,i-1)*45ll%mod);
			cth[i]=ctg[i]=qpow(9,i);
			for(int j=2;j<i;j++)
				cadd(h[i],1ll*h[j-1]*g[i-j]%mod),
				cadd(cth[i],1ll*cth[j-1]*ctg[i-j]%mod);
			f[i]=h[i];
			ctf[i]=cth[i];
			for(int j=2;j<i;j++)
				cadd(f[i],add(1ll*f[j-1]*cth[i-j]%mod,1ll*h[i-j]*ctf[j-1]%mod)),
				cadd(ctf[i],1ll*ctf[j-1]*cth[i-j]%mod);
		}
		cout << f[n] << '\n';
		return 0;
	}
}
namespace linear{
	const int N=100010;
	int ans[N][2],mul[N][2],sum[N][2],cnt[N][2];
	int main(){
		ans[1][1]=0;
		mul[1][1]=45;
		sum[1][1]=9;
		cnt[1][1]=9;
		for(int i=1;i<n;i++){
			//
			cadd(ans[i+1][1],ans[i][1]*9ll%mod);
			cadd(sum[i+1][1],sum[i][1]*9ll%mod);
			cadd(cnt[i+1][1],cnt[i][1]*9ll%mod);
			cadd(mul[i+1][1],mul[i][1]*90ll%mod);
			cadd(mul[i+1][1],sum[i][1]*45ll%mod);
			//
			cadd(ans[i+1][0],ans[i][1]*2ll%mod);
			cadd(sum[i+1][0],mul[i][1]);
			cadd(sum[i+1][0],cnt[i][1]);
			cadd(ans[i+1][0],mul[i][1]);
			cadd(cnt[i+1][0],cnt[i][1]*2ll%mod);
			//
			cadd(ans[i+1][1],ans[i][0]*9ll%mod);
			cadd(sum[i+1][1],sum[i][0]*9ll%mod);
			cadd(cnt[i+1][1],cnt[i][0]*9ll%mod);
			cadd(mul[i+1][1],mul[i][0]*90ll%mod);
			cadd(mul[i+1][1],sum[i][0]*45ll%mod);
		}
		cout << add(ans[n][1],mul[n][1]) << '\n';
		return 0;
	}
}
namespace ac{
	const int M=8;
	struct Matrix{
		int a[M][M];
		void mem(){
			for(int i=0;i<M;i++)
				for(int j=0;j<M;j++)
					a[i][j]=0;
		}
		Matrix operator * (const Matrix &y)const{
			Matrix z;z.mem();
			for(int i=0;i<8;i++)
				for(int j=0;j<8;j++)
					for(int k=0;k<8;k++)
						cadd(z.a[i][j],1ll*a[i][k]*y.a[k][j]%mod);
			return z;
		}
	}tmp,ans;
	int main(){
		for(int i=0;i<8;i++)ans.a[i][i]=1;
		tmp.a[0][0]=9;
		tmp.a[2][2]=9;
		tmp.a[3][3]=9;
		tmp.a[1][1]=90;
		tmp.a[2][1]=45;
		//
		tmp.a[0][4]=2;
		tmp.a[1][6]=1;
		tmp.a[3][6]=1;
		tmp.a[1][4]=1;
		tmp.a[3][7]=2;
		//
		tmp.a[4][0]=9;
		tmp.a[6][2]=9;
		tmp.a[7][3]=9;
		tmp.a[5][1]=90;
		tmp.a[6][1]=45;
		--n;
		while(n){
			if(n&1)
				ans=ans*tmp;
			tmp=tmp*tmp;
			n>>=1;
		}
		vi qwq={0,45,9,9};
		int s=0;
		for(int i=1;i<4;i++)
			cadd(s,1ll*qwq[i]*ans.a[i][0]%mod),
			cadd(s,1ll*qwq[i]*ans.a[i][1]%mod);
		cout << s << '\n';
		return 0;
	}
}
signed main(){
	#ifdef do_while_true
//		assert(freopen("data.in","r",stdin));
//		assert(freopen("data.out","w",stdout));
	#endif
	read(n);
	// if(n<=1000)return bf::main();
	// return linear::main();
	return ac::main();
    #ifdef do_while_true
		cerr<<'\n'<<"Time:"<<1.0*clock()/CLOCKS_PER_SEC*1000<<" ms"<<'\n';
	#endif
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3604kb

input:

1

output:

45

result:

ok answer is '45'

Test #2:

score: 0
Accepted
time: 3ms
memory: 3472kb

input:

3

output:

407430

result:

ok answer is '407430'

Test #3:

score: 0
Accepted
time: 0ms
memory: 3488kb

input:

1000000000000000000

output:

493565653

result:

ok answer is '493565653'

Test #4:

score: 0
Accepted
time: 3ms
memory: 3628kb

input:

999999999999999254

output:

963821656

result:

ok answer is '963821656'

Test #5:

score: 0
Accepted
time: 0ms
memory: 3600kb

input:

2

output:

4455

result:

ok answer is '4455'

Test #6:

score: 0
Accepted
time: 0ms
memory: 3544kb

input:

999999999999999062

output:

256461144

result:

ok answer is '256461144'

Test #7:

score: 0
Accepted
time: 2ms
memory: 3628kb

input:

4

output:

36934785

result:

ok answer is '36934785'

Test #8:

score: 0
Accepted
time: 0ms
memory: 3632kb

input:

5

output:

350210541

result:

ok answer is '350210541'

Test #9:

score: 0
Accepted
time: 3ms
memory: 3700kb

input:

6

output:

427185456

result:

ok answer is '427185456'

Test #10:

score: 0
Accepted
time: 3ms
memory: 3548kb

input:

7

output:

991901155

result:

ok answer is '991901155'

Test #11:

score: 0
Accepted
time: 2ms
memory: 3488kb

input:

8

output:

110899952

result:

ok answer is '110899952'

Test #12:

score: 0
Accepted
time: 3ms
memory: 3484kb

input:

9

output:

89411672

result:

ok answer is '89411672'

Test #13:

score: 0
Accepted
time: 2ms
memory: 3488kb

input:

10

output:

401287887

result:

ok answer is '401287887'

Test #14:

score: 0
Accepted
time: 2ms
memory: 3488kb

input:

172

output:

376377812

result:

ok answer is '376377812'

Test #15:

score: 0
Accepted
time: 2ms
memory: 3544kb

input:

238

output:

81946973

result:

ok answer is '81946973'

Test #16:

score: 0
Accepted
time: 1ms
memory: 3604kb

input:

730

output:

661959857

result:

ok answer is '661959857'

Test #17:

score: 0
Accepted
time: 2ms
memory: 3604kb

input:

684

output:

828317367

result:

ok answer is '828317367'

Test #18:

score: 0
Accepted
time: 1ms
memory: 3716kb

input:

633

output:

673539741

result:

ok answer is '673539741'

Test #19:

score: 0
Accepted
time: 2ms
memory: 3716kb

input:

897

output:

159321465

result:

ok answer is '159321465'

Test #20:

score: 0
Accepted
time: 3ms
memory: 3716kb

input:

809

output:

521464595

result:

ok answer is '521464595'

Test #21:

score: 0
Accepted
time: 3ms
memory: 3696kb

input:

302

output:

92391482

result:

ok answer is '92391482'

Test #22:

score: 0
Accepted
time: 3ms
memory: 3576kb

input:

261

output:

854903269

result:

ok answer is '854903269'

Test #23:

score: 0
Accepted
time: 1ms
memory: 3532kb

input:

497

output:

594207939

result:

ok answer is '594207939'

Test #24:

score: 0
Accepted
time: 3ms
memory: 3544kb

input:

951

output:

927809758

result:

ok answer is '927809758'

Test #25:

score: 0
Accepted
time: 2ms
memory: 3736kb

input:

980

output:

65372821

result:

ok answer is '65372821'

Test #26:

score: 0
Accepted
time: 2ms
memory: 3624kb

input:

1000

output:

971150090

result:

ok answer is '971150090'

Test #27:

score: 0
Accepted
time: 0ms
memory: 3620kb

input:

969

output:

511011493

result:

ok answer is '511011493'

Test #28:

score: 0
Accepted
time: 2ms
memory: 3604kb

input:

998

output:

549357456

result:

ok answer is '549357456'

Test #29:

score: 0
Accepted
time: 2ms
memory: 3628kb

input:

98558

output:

245733611

result:

ok answer is '245733611'

Test #30:

score: 0
Accepted
time: 2ms
memory: 3660kb

input:

35873

output:

524107440

result:

ok answer is '524107440'

Test #31:

score: 0
Accepted
time: 2ms
memory: 3616kb

input:

3015

output:

928761172

result:

ok answer is '928761172'

Test #32:

score: 0
Accepted
time: 2ms
memory: 3552kb

input:

44398

output:

339084928

result:

ok answer is '339084928'

Test #33:

score: 0
Accepted
time: 3ms
memory: 3544kb

input:

82497

output:

273305194

result:

ok answer is '273305194'

Test #34:

score: 0
Accepted
time: 0ms
memory: 3616kb

input:

81678

output:

423439974

result:

ok answer is '423439974'

Test #35:

score: 0
Accepted
time: 1ms
memory: 3696kb

input:

95002

output:

868411966

result:

ok answer is '868411966'

Test #36:

score: 0
Accepted
time: 0ms
memory: 3716kb

input:

56392

output:

127537737

result:

ok answer is '127537737'

Test #37:

score: 0
Accepted
time: 2ms
memory: 3624kb

input:

49489

output:

841113901

result:

ok answer is '841113901'

Test #38:

score: 0
Accepted
time: 2ms
memory: 3636kb

input:

57109

output:

808819191

result:

ok answer is '808819191'

Test #39:

score: 0
Accepted
time: 2ms
memory: 3616kb

input:

99674

output:

890052301

result:

ok answer is '890052301'

Test #40:

score: 0
Accepted
time: 1ms
memory: 3608kb

input:

99513

output:

147223708

result:

ok answer is '147223708'

Test #41:

score: 0
Accepted
time: 2ms
memory: 3600kb

input:

99950

output:

638000302

result:

ok answer is '638000302'

Test #42:

score: 0
Accepted
time: 2ms
memory: 3544kb

input:

99939

output:

627100241

result:

ok answer is '627100241'

Test #43:

score: 0
Accepted
time: 2ms
memory: 3628kb

input:

99904

output:

768803875

result:

ok answer is '768803875'

Test #44:

score: 0
Accepted
time: 2ms
memory: 3612kb

input:

822981260158560519

output:

500129705

result:

ok answer is '500129705'

Test #45:

score: 0
Accepted
time: 2ms
memory: 3620kb

input:

28316250878314571

output:

954707612

result:

ok answer is '954707612'

Test #46:

score: 0
Accepted
time: 2ms
memory: 3620kb

input:

779547116602636424

output:

349022088

result:

ok answer is '349022088'

Test #47:

score: 0
Accepted
time: 3ms
memory: 3624kb

input:

578223540025879436

output:

310507001

result:

ok answer is '310507001'

Test #48:

score: 0
Accepted
time: 2ms
memory: 3548kb

input:

335408917862248766

output:

399860005

result:

ok answer is '399860005'

Test #49:

score: 0
Accepted
time: 2ms
memory: 3608kb

input:

74859962623990078

output:

905924996

result:

ok answer is '905924996'

Test #50:

score: 0
Accepted
time: 0ms
memory: 3608kb

input:

252509054434733439

output:

57677315

result:

ok answer is '57677315'

Test #51:

score: 0
Accepted
time: 2ms
memory: 3544kb

input:

760713016476890622

output:

840620988

result:

ok answer is '840620988'

Test #52:

score: 0
Accepted
time: 2ms
memory: 3600kb

input:

919845426262803496

output:

929606336

result:

ok answer is '929606336'

Test #53:

score: 0
Accepted
time: 2ms
memory: 3620kb

input:

585335723211847194

output:

975973040

result:

ok answer is '975973040'

Test #54:

score: 0
Accepted
time: 2ms
memory: 3528kb

input:

999999999999999478

output:

859690282

result:

ok answer is '859690282'

Test #55:

score: 0
Accepted
time: 2ms
memory: 3472kb

input:

999999999999999902

output:

879587490

result:

ok answer is '879587490'

Test #56:

score: 0
Accepted
time: 2ms
memory: 3700kb

input:

999999999999999168

output:

585232180

result:

ok answer is '585232180'