范德蒙矩阵

举报
用户已注销 发表于 2021/11/19 00:44:01 2021/11/19
【摘要】 目录 一,范德蒙矩阵 二,OJ实战 51Nod - 1960 范德蒙矩阵 一,范德蒙矩阵   二,OJ实战 51Nod - 1960 范德蒙矩阵 LYK最近在研究范德蒙矩阵与矩阵乘法,一个范德蒙矩阵的形式如下: 它想通过构造一个含有1~nm的n*m的矩阵G,使得G*V得到的n*n的矩阵T中所有位...

目录

一,范德蒙矩阵

二,OJ实战

51Nod - 1960 范德蒙矩阵


一,范德蒙矩阵

 

二,OJ实战

51Nod - 1960 范德蒙矩阵

LYK最近在研究范德蒙矩阵与矩阵乘法,一个范德蒙矩阵的形式如下:

它想通过构造一个含有1~nm的n*m的矩阵G,使得G*V得到的n*n的矩阵T中所有位置上的元素之和最大。其中n,m<=100000,ai<=2*10^9。

你只需输出这个值对1e9+7取模后的结果。

 

在样例中,矩阵G为

1 4

2 3

当然可能存在其它的方法使得答案最大。

Input

第一行两个数n,m,接下来一行m个数表示ai。

Output

一个数表示答案

Sample Input

2 2
2 3

Sample Output

37

思路:把G中的数当做变量,V中的数当做常数,分析各变量的系数即可。

结论:每一列的n个数的系数是一样的,不同列的系数之和ai有关

假设{ai}是递增的,那么G的第一列是1 - n,第二列是n+1 - 2n,... 第m列是n(m-1)+1 - nm

代码:


  
  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. int mod = 1000000007;
  5. template<typename A>
  6. A opMulti(A x, A y)
  7. {
  8. return x*y%mod;
  9. }
  10. template<typename A,typename N>
  11. A aijiMulti(A a, N n, A(*pfunc)(A,A))
  12. {
  13. if(n<=1)return a;
  14. A ans = aijiMulti(a, n/2, pfunc);
  15. ans = pfunc(ans,ans);
  16. if(n%2)ans = pfunc(ans,a);
  17. return ans;
  18. }
  19. int main()
  20. {
  21. ios::sync_with_stdio(false);
  22. long long n,m,a[100000];
  23. cin>>n>>m;
  24. for(int i=0;i<m;i++)cin>>a[i];
  25. sort(a,a+m);
  26. long long xg=-n*(n-1)/2,xv,ans=0;
  27. for(int i=0;i<m;i++){
  28. if(a[i]%mod==1)xv=n;
  29. else xv=(1-aijiMulti(a[i],n,opMulti<long long>))*aijiMulti(1-a[i],mod-2,opMulti<long long>)%mod;
  30. xg=(xg+n*n)%mod,ans+=xg*xv%mod;
  31. }
  32. cout<<ans%mod;
  33. return 0;
  34. }

 

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/116990211

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。