时间复杂度正确,为啥TLE?
  • 板块P6298 齿轮
  • 楼主Ethan812820
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/10/4 10:38
  • 上次更新2024/10/4 12:58:23
查看原帖
时间复杂度正确,为啥TLE?
1112010
Ethan812820楼主2024/10/4 10:38

记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<signed> ys[1000005];
signed n,m,k,M=-1,a[1000005],cnt[1000005],cnt2[1000005],ans[1000005],fac[1000005],ny[1000005],P=1000000007;
int fp(int a,int b,int p){
    a%=p;
    int base=a,ans=1;
    while(b){
        if(b&1ll){
            ans=ans*base%p;
        }
        base=base*base%p;
        b>>=1ll;
    }
    return ans;
}
void init(){
    for(register signed i=1;i<=M;i++){
        for(register signed j=1;i*j<=M;j++){
        //cout<<123;
            ys[i*j].push_back(i);
            cnt[i]+=cnt2[i*j];
        }
    }
    fac[0]=1;
    for(register signed i=1;i<=n;i++){
   // cout<<123;
        fac[i]=((int)fac[i-1]*i)%P;
        ny[i]=fp(fac[i],P-2,P);
    }
    //for(int i=1;i<=n;i++) cout<<ny[i]<<" ";
    //cout<<"\n";
}
int C(int x,int y){
    if(x<y) return 0;
    if(x==y) return 1;
    return ((int)((int)fac[x]*ny[x-y])%P*ny[y])%P;
}
inline signed read(){
    char c=getchar();
    signed ans=0;
    while(c<'0'||c>'9'){
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        ans=ans*10+(c-48);
        c=getchar();
    }    
    return ans;    
}
inline void write(signed x,bool f){
    if(x==0){
        if(!f) putchar('0');
        return;
    }    
    write(x/10,1);
    putchar(x%10+48);
}
signed main()
{
    //cout<<C(1000,501);
   // cout<<234;
    //scanf("%d%d%d",&n,&m,&k);
    n=read(),m=read(),k=read();
    //cout<<123;
    //init();
    //cout<<777;
    for(register signed i=1;i<=n;i++){
        //scanf("%d",&a[i]);
        a[i]=read();
        M=max(M,a[i]);
        cnt2[a[i]]++;
        //cout<<368;
    }
    //cout<<666;
    init();
    
    /*for(register signed i=1;i<=M;i++){
        if(cnt2[i]){
            for(register int j=0;j<ys[i].size();j++){
                cnt[ys[i].at(j)]+=cnt2[i];
            }
        }
        //ans[i]=C(cnt[i],k);
    } */   
    /*for(register signed i=M;i>=1;i--){
        ans[i]=C(cnt[i],k);
    }*/
    //cout<<"C:"<<C(1000,500)<<endl;
    /*for(int i=1;i<=M;i++){
        cout<<ans[i]<<" ";
    }
    cout<<endl;*/    
    for(register signed i=M;i>=1;i--){
        ans[i]=(ans[i]+C(cnt[i],k))%P;
        if(ans[i]){
            for(register signed j=0;j<ys[i].size()-1;j++){
                ans[ys[i].at(j)]=(ans[ys[i].at(j)]-ans[i]+P)%P;
            }
        }        
    }
    for(register signed i=1;i<=m;i++){
        //printf("%d ",ans[i]);
        write(ans[i],ans[i]);
        putchar(' ');
    }
    return 0;
}
2024/10/4 10:38
加载中...