合约数

题目:
链接:https://www.nowcoder.com/acm/contest/91/B
来源:牛客网

给定一棵n个节点的树,并且根节点的编号为p,第i个节点有属性值vali, 定义F(i): 在以i为根的子树中,属性值是vali的合约数的节点个数。y 是 x 的合约数是指 y 是合数且 y 是 x 的约数。小埃想知道对1000000007取模后的结果.
输入描述:
输入测试组数T,每组数据,输入n+1行整数,第一行为n和p,1<=n<=20000, 1<=p<=n, 接下来n-1行,每行两个整数u和v,表示u和v之间有一条边。第n+1行输入n个整数val1, val2,…, valn,其中1<=vali<=10000,1<=i<=n.
输出描述:
对于每组数据,输出一行,包含1个整数, 表示对1000000007取模后的结果
示例1
输入

2
5 4
5 3
2 5
4 2
1 3
10 4 3 10 5
3 3
1 3
2 1
1 10 1
输出

11
2
备注:
n>=10000的有20组测试数据

合数:除1与本身外,还存在其他的除数
dfs到该节点时还未遍历其子节点再次回溯到该节点时已经遍历过其子节点,两者相减即为子节点中合约数的个数

代码:

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const int N=20005;

vector<int> g[N];
int val[N];
bool isprime[N];
vector<short> f[N];
int cnt[N],F[N];
ll res;
const ll MOD =1E9+7;

void init()
{
    for(int i=2;i<N;i++) isprime[i]=1;
    for(int i=2;i<N;i++)//找出合数
    {
        if(isprime[i])
        {
            for(int j=i+i;j<N;j+=i)
            {
                isprime[j]=0;
             } 
        }
    }
    for(int i=4;i<=10000;i++)//找出每个数的合约数并用f[]进行存储
    {
        if(!isprime[i])
        {
            for(int j=i;j<=10000;j+=i)
            {
                f[j].push_back(i);

            }
        }
    }
    //for(int i=0;i<f[20].size();i++) printf("%d ",f[20][i]);
}

void dfs(int u,int par)//节点和父节点
{
     for(int i=0;i<f[val[u]].size();i++)
     {
        int num=f[val[u]][i];
        F[u]-=cnt[num];//先减去之前出现过的
     }
     cnt[val[u]]++;//cnt统计出现的次数
     for(int i=0;i<g[u].size();i++)
     {
        int v=g[u][i];
        if(v==par) continue;
        dfs(v,u);
     }
     for(int i=0;i<f[val[u]].size();i++)
     {
        int num=f[val[u]][i];
        F[u]+=cnt[num];
     }
     res+=F[u]*1LL*u;
     res%=MOD;

}

int main()
{
    int T;
    init();
    scanf("%d",&T);
    while(T--)
    {
        memset(cnt,0,sizeof(cnt));
        res=0;
        int n,p;
        scanf("%d %d",&n,&p);
        for(int i=1;i<=n;i++) F[i]=0,g[i].clear();
        for(int i=1;i<n;i++)
        {
            int u,v;
            scanf("%d %d",&u,&v);
            g[u].push_back(v);
            g[v].push_back(u);

        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&val[i]);
        }
        dfs(p,-1);
        printf("%lld\n",res);
    }
    return 0;
}
内容概要:文章详细探讨了据连接性和云集成在增强汽车电子电气架构(EEA)方面的重要作用。首先介绍了从分布式到集中式架构的技术演进,解释了域集中式和中央集中式架构的优势,如远程软件升级(OTA)、软硬件解耦等。其次,阐述了云平台在远程软件更新、据存储与分析等方面的支持作用。接着,强调了据连接性在实时通信、低延迟决策、多模态传感器融以及工业物联网集成中的核心作用。此外,讨论了云集成在个性化服务、AI助手、自动驾驶训练与仿真、预测性维护等方面的应用。最后,分析了市场需求与政策支持对这一领域的影响,并展望了未来的发展趋势,如5G-A/6G、边缘计算与AI大模型的融。 适用人群:汽车电子工程师、智能网联汽车行业从业者及相关领域的研究者。 使用场景及目标:①理解汽车电子电气架构从分布式到集中式的演进过程及其带来的优势;②掌握据连接性和云集成在提升车辆智能化水平的具体应用和技术细节;③了解相关政策法规对智能网联汽车发展的支持与规范;④探索未来技术发展趋势及其可能带来的变革。 其他说明:本文不仅提供了技术层面的深入解析,还结了实际应用案例,如特斯拉、蔚来、中联重科、约翰迪尔等企业的实践成果,有助于读者全面理解据连接性和云集成在现代汽车工业中的重要地位。同时,文中提及的政策法规也为行业发展指明了方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值