求助,一直TLE在#7
查看原帖
求助,一直TLE在#7
236416
_stOrz_楼主2022/1/19 12:05
#include<bits/stdc++.h>
#define int long long
const int mod = 1e9 + 7;
using namespace std;
struct node{
    int to, next;
}k[1000005];
int head[1000005], tot = 1, dfn[100005], ans, size;
bool vis[1000005];
inline int add(int a, int b){
    k[++tot].to = b;
    k[tot].next = head[a];
    head[a] = tot;
}

void dfs(int now, int val){
    size++;
    dfn[now] = val;
   // vis_[now] = true;
    for(register int i = head[now]; i; i = k[i].next){
        //cout << 1 << "\n";
        if(vis[i ^ 1] == true or vis[i] == true) continue;
        if(dfn[k[i].to] != 0){
            ans = abs(dfn[now] - dfn[k[i].to]) + 1;
            vis[i] = true, vis[i ^ 1] = true;
            //cout << dfn[now] << " " << dfn[k[i].to] << "\n";
            return;
        } 
        vis[i] = true, vis[i ^ 1] = true;
        dfs(k[i].to, dfn[now] + 1);
    }
    return;
}

int times(int x){
    int sum = 1, now = 2;
    while(x){
        if(x & 1) sum *= now;
        sum %= mod;
        now *= now;
        now %= mod;
        x >>= 1;
    }
    return sum;
}

signed main(){
    int n, a, sum = 1;
    scanf("%lld", &n);
    for(register int i = 1; i <= n; i++){
        scanf("%lld", &a);
        add(a, i), add(i, a);
    }
    for(register int i = 1; i <= n; i++){
        if(dfn[i] == 0){
            size = 0;
            dfs(i, 1);
           // cout << "s" << "\n";
            //cout << size << " " << ans << "\n";
            sum *= times(size) - times(size - ans + 1);
            sum %= mod;
        }
    }
    printf("%lld\n", sum);
}

蒟蒻调的快吐了,嘤嘤嘤

2022/1/19 12:05
加载中...