【补题日记】[2022牛客暑期多校2]I-let fat tension

Pro

https://ac.nowcoder.com/acm/contest/33187/I

Sol

其实是个简单的计算题,不过比赛的时候榜被带歪了所以没人看这个题。

接下来化简式子(增加的下标o的含义为Y向量的每个分量的下标): Y i n e w = ∑ j = 1 n ∑ p = 1 k X i p ⋅ X j p ∣ X i ∣ ⋅ ∣ X j ∣ Y i Y_{i}^{new}=\sum_{j=1}^{n}\sum_{p=1}^{k}\frac{X_{ip}·X_{jp}}{|X_i|·|X_j|}Y_{i} Yinew=j=1np=1kXiXjXipXjpYi
Y i , o n e w = ∑ j = 1 n ∑ p = 1 k X i p ⋅ X j p ∣ X i ∣ ⋅ ∣ X j ∣ Y i , o Y_{i,o}^{new}=\sum_{j=1}^{n}\sum_{p=1}^{k}\frac{X_{ip}·X_{jp}}{|X_i|·|X_j|}Y_{i,o} Yi,onew=j=1np=1kXiXjXipXjpYi,o
Y i , o n e w = ∑ j = 1 n ∑ p = 1 k X i p ∣ X i ∣ ⋅ X j p ∣ X j ∣ Y i , o Y_{i,o}^{new}=\sum_{j=1}^{n}\sum_{p=1}^{k}\frac{X_{ip}}{|X_i|}·\frac{X_{jp}}{|X_j|}Y_{i,o} Yi,onew=j=1np=1kXiXipXjXjpYi,o
Y i , o n e w = ∑ p = 1 k ( X i p ∣ X i ∣ ⋅ ∑ j = 1 n X j p ∣ X j ∣ Y i , o ) Y_{i,o}^{new}=\sum_{p=1}^{k}(\frac{X_{ip}}{|X_i|}·\sum_{j=1}^{n}\frac{X_{jp}}{|X_j|}Y_{i,o}) Yi,onew=p=1k(XiXipj=1nXjXjpYi,o)

Z p , o = ∑ j = 1 n X j p ∣ X j ∣ Y i , o Z_{p,o}=\sum_{j=1}^{n}\frac{X_{jp}}{|X_j|}Y_{i,o} Zp,o=j=1nXjXjpYi,o,则
Y i , o n e w = ∑ p = 1 k ( X i p ∣ X i ∣ ⋅ Z p , o ) Y_{i,o}^{new}=\sum_{p=1}^{k}(\frac{X_{ip}}{|X_i|}·Z_{p,o}) Yi,onew=p=1k(XiXipZp,o)

可以输入完后直接预处理出 X i , p ∣ X i ∣ \frac{X_{i,p}}{|X_i|} XiXi,p X j , p ∣ X j ∣ \frac{X_{j,p}}{|X_j|} XjXj,p,可以看出来计算 Z p , o Z_{p,o} Zp,o Y i , o n e w Y_{i,o}^{new} Yi,onew的时间复杂度均为 O ( n k d ) O(nkd) O(nkd)

Code

//By cls1277
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define Fo(i,a,b) for(LL i=(a); i<=(b); i++)
#define Ro(i,b,a) for(LL i=(b); i>=(a); i--)
#define Eo(i,x,_) for(LL i=head[x]; i; i=_[i].next)
#define Ms(a,b) memset((a),(b),sizeof(a))
#define endl '\n'

const LL maxn = 1e4+5;
LL n, k, d;
double x[maxn][55], y[maxn][55], z[maxn][55], ans[maxn][55];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    #ifdef DEBUG
    freopen("data.txt","r",stdin);
    #endif
    cin>>n>>k>>d;
    Fo(i,1,n) {
        double len = 0;
        Fo(j,1,k) {
            cin>>x[i][j];
            len += x[i][j]*x[i][j];
        }
        len = sqrt(len);
        Fo(j,1,k) x[i][j] /= len;
    }
    Fo(i,1,n)
        Fo(j,1,d)
            cin>>y[i][j];
    Fo(i,1,n)
        Fo(j,1,k)
            Fo(l,1,d)
                z[j][l] += x[i][j]*y[i][l];
    Fo(i,1,n)
        Fo(j,1,d)
            Fo(l,1,k)
                ans[i][j] += x[i][l]*z[l][j];
    Fo(i,1,n) {
        Fo(j,1,d)
            cout<<fixed<<setprecision(8)<<ans[i][j]<<' ';
        cout<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cls1277

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值