萌新求助时间复杂度分析
查看原帖
萌新求助时间复杂度分析
311306
dk_qwq楼主2023/10/1 17:11

RT,我认为我的代码是O(Wlog∣W∣)O(Wlog |W|)的,但是为什么会T呢

#include<iostream>
#include<cstdio>
#include<vector>
#define pb push_back
#include<cstring>
using namespace std;
namespace INPUT{
    char buf[1<<20],*p1,*p2;
    #define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
inline T read(){
    T x=0,p=1;
    char ch=gc();
    for(;ch<'0'||ch>'9';ch=gc())
        if(ch=='-') p=-1;
    for(;ch>='0'&&ch<='9';ch=gc())
        x=(x<<3)+(x<<1)+(ch^48);
    return x*p;
}
#define ll long long
const ll mod=1e9+7;
ll qpow(ll x,ll k,ll mod=1e9+7){
	ll res=1;
	while(k){
		if(k&1) res=res*x%mod;
		x=x*x%mod,k>>=1;
	}
	return res;
}
const int M=3;
struct Matrix{
	ll c[M][M];
	Matrix() {memset(c,0,sizeof(c));}
	ll* operator[](int index){
		return c[index];
	}
	friend Matrix operator*(Matrix& A,Matrix& B){
		Matrix C;
		for(int i=1;i<=2;i++) for(int j=1;j<=2;j++)
			for(int k=1;k<=2;k++) C[i][j]=(C[i][j]+A[i][k]*B[k][j]%mod)%mod;
		return C;
	}
};
ll Fib(ll k){k--;
	Matrix base;
	base[1][1]=0;
	base[1][2]=base[2][1]=base[2][2]=1;
	Matrix res;
	res[1][1]=res[2][2]=1;
	res[1][2]=res[2][1]=0;
	while(k){
		if(k&1) res=res*base;
		base=base*base,k>>=1;
	}
	return res[2][2];
}
const int N=1e6+5;
vector<int>primes;
bool flag[N];
int mu[N];
int c[N];
ll Sum_Fib[N],Sum_c[N];
int n,k;
void init(int _n){
	mu[1]=1;
	for(int i=2;i<=_n;i++){
		if(!flag[i]) primes.pb(i),mu[i]=-1;
		for(auto prime:primes){
			if(i*prime>_n) break;
			flag[i*prime]=true;
			if(i%prime==0) break;
			mu[i*prime]=-mu[i];
		}
	}
	for(int i=1;i<=_n;i++){
		ll A=Fib(qpow(i,k,2000000016));
		for(int j=1;i*j<=_n;j++)
			Sum_Fib[i*j]=(Sum_Fib[i*j]+A*mu[j]%mod)%mod;
	}
	for(int T=1;T<=_n;T++) for(int i=1;i*T<=_n;i++)
		Sum_c[T]=(Sum_c[T]+c[i*T])%mod;
}
const int W=1e6;
int main(){
	// freopen("SP31893.in","r",stdin);
	// freopen("SP31893.out","w",stdout);
	n=read<int>(),k=read<int>();
	ll ans=0;
	for(int i=1;i<=n;i++) {
		int x=read<int>();
		c[x]++;
		ans=(ans-Fib(qpow(x,k,2000000016)))%mod;
	}
	init(W);
	for(int i=1;i<=W;i++){
		ans=(ans+Sum_Fib[i]*Sum_c[i]%mod*Sum_c[i]%mod)%mod;
	}
	cout<<ans*qpow(2,mod-2)%mod<<endl;
}
2023/10/1 17:11
加载中...