36pts求调,WA on #10~#25
查看原帖
36pts求调,WA on #10~#25
691463
somebody_kang楼主2024/11/28 23:16

rt,经苯人手玩检查核心代码(线性筛)原理上应该是没什么问题,我感觉是取模有地方出事了,但是又感觉该取模的地方都取到了qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
vector<int> prime;
bool vis[21451419];
int d[21451419],num[21451419],g[21451419],n;
void init(){//ÏßÐÔÉ¸ËØÊý 
	for(int i=2;i<=1e5;++i){
		if(!vis[i]){
			prime.push_back(i);
		}
		for(int j=0;j<prime.size();++j){
			int t=prime[j];
			if(t*i>1e5) break;
			vis[i*t]=1;
			if(!(i%t)) break;
		}
	}
}
signed main(){
	init();
	int a,b,c;
	cin>>n>>a>>b>>c;
	cin>>g[n];
	for(int i=n-1;i>=1;--i) g[i]=((a%mod*g[i+1]%mod*g[i+1]%mod)%mod+b*g[i+1]%mod+c)%mod;
	d[1]=1;
	for(int i=2;i<=n;++i){//ÏßÐÔɸԼÊý¸öÊý 
		if(!vis[i]){
			num[i]=1;d[i]=2;
		}
		else{
			int p;
			for(int j=0;j<prime.size();++j)
				if(!(i%prime[j])){
					p=prime[j];break;
				}
			int q=i/p;
			if(q%p){
				num[i]=1;d[i]=d[q]*2;
			}
			else{
				num[i]=num[q]+1;d[i]=d[q]*(num[i]+1)/num[i];
			}
			num[i]%=mod;d[i]%=mod;
		}
	}
	for(int i=1;i<=n;++i){
		d[i]+=d[i-1];d[i]%=mod;//ͳ¼ÆÇ°×ººÍ 
	}
	int ans=0;
	for(int i=1;i<=n;++i){
		ans+=(((n-i+1)%mod)*((d[i-1]+n)%mod)%mod)*g[i]%mod;//ͳ¼Æ´ð°¸ 
		ans%=mod;
	}
	cout<<ans;
    return 0;
}
2024/11/28 23:16
加载中...