60points求调 出现了大得离谱的质因数
查看原帖
60points求调 出现了大得离谱的质因数
1472827
stewpid楼主2025/6/18 22:53
#include <iostream>
#include <cmath>
#include <string>
#include <algorithm>
#include <numeric>
#include <vector>
#include <climits>
#include <iomanip>
#include <sstream>
#include <tuple>
#include <map>
#include <unordered_map>
#include <queue>
#include <stack>
#include <set>
#define int unsigned long long
#define endl "\n"
using namespace std;
vector<int> fa(10);//0~9的数字并查集
int find(int a)
{
    if(a!=fa[a])fa[a]=find(fa[a]);
    return fa[a];
}
void un(int a,int b)
{
    int afa=find(a),bfa=find(b);
    fa[bfa]=afa;
}//无所谓优化 这里就10个点
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    int k;
    cin>>s>>k;
    iota(fa.begin(),fa.end(),0);//初始化!
    int x,y;
    for(int i=0;i<k;++i)
    {
        cin>>x>>y;
        un(x,y);
    }
    unordered_map<int,int> cnt;// <ancestor,ancestor_count>
    unordered_map<int,int> num;// <num,num's_ancestor_count>
    //额外开一个num提高一点(?)性能   毕竟查找O(1)  而数字内每次重新find远远高于O(1)
    for(int i=0;i<=9;++i)
        ++cnt[find(i)];//每个子孙给ancestor加一count
    for(int i=0;i<=9;++i)
        num[i]=cnt[find(i)];//子孙继承ancestor的count
    
//    cout<<endl;//格式行
//    for(int i=0;i<=9;++i)cout<<num[i]<<endl;//验证行
    
    int ans=1;
    //首位数字特殊处理
    x=static_cast<int>(s[0]-'0');
    ans=num[x];
    if(find(x)==find(0))
    {
        --ans;
    }
    for(int c=1;c<s.size();++c)
    {
        int n=static_cast<int>(s[c]-'0');
        ans*=num[n];
    }
    cout<<ans;
    return 0;
}


2025/6/18 22:53
加载中...