P6060 [加油武漢]傳染病研究:數論,線性篩素數。

洛谷月賽的題目,不會做,只會打20分的baoli,看了題解也沒弄明白怎麼線性求多項式的,lypAC啦後,抄了他的代碼,才明白。

還是不會用markdown寫公式,只好手寫啦。參考代碼:我抄的啦!

//copy form lyp
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MaAXN = 1e7 + 1;
const int mod = 998244353;

bool isnp[MAXN];
int p[MAXN],pcnt=0;
int pre[MAXN];//記錄其沒有最後一個因子的的數。 

int b[MAXN][9+1];//分解後因數的係數多項式的積,分解的因數前面的大於後面的。 

void sieve(int n) {
	isnp[0]=isnp[1]=1;
	b[1][0]=1;
	for(int i=2; i<=n; ++i) {
		if(!isnp[i]) {
			p[++pcnt]=i;
			b[i][0]=1;
			b[i][1]=1;
			pre[i]=1;
		}
		for(int j=1; j<=pcnt; ++j) {
			if((ll)i*p[j]>n) break;
			int now = i*p[j];
			isnp[now]=1;
			if(i%p[j]) {// (1+a1)(1+a2)*...*(1+aj) //增加了 ai且aj=1;
				pre[now] = i;
				for(int k=0; k<=8; ++k) b[now][k]=b[i][k];
				for(int k=0; k<8; ++k) b[now][k+1]+= b[i][k];
				
			} else {//(1+a1)(1+a2)*...*(1+aj+1) //aj增加了1 
				pre[now] = pre[i];
				for(int k=0; k<=8; ++k) b[now][k] = b[i][k];
				for(int k=0; k<8; ++k) b[now][k+1]+=b[pre[i]][k];
				break;
			}
		}
	}

	for(int i=1; i<=n; ++i)
		for(int j=0; j<=8; ++j)
			b[i][j]=(b[i][j]+b[i-1][j])%mod;
}

int pwd[9];

int main(void) {
	sieve(1e7);
	int T;
	scanf("%d",&T);
	while(T--) {
		int n,d;
		scanf("%d%d",&n,&d);
		pwd[0]=1;
		for(int i=1; i<=8; ++i)
			pwd[i] = (ll)pwd[i-1]*d %mod;

		int ans=0;
		for(int i=0; i<=8; ++i)
			ans=((ll)ans+(ll)b[n][i]*pwd[i]) %mod;
		printf("%d\n",ans);
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章