一两眼题(oneortwo)
2024-10-20 00:23:56
一两眼题(oneortwo)
题目描述
给出n个整数,依次为a1,a2,...an。n<=50000.
你要进行K次操作,0 <= k < =1,414,213,562
每次操作你算出sum=a1+a2+a3+...an,再将每个数替换为sum-ai.
求最后一次操作后a1,a2,....an的值
输入
第一行两个整数n,k
接下来n行每行一个整数ai.
输出
输出n行。依次为k次操作后的a1,a2....an。模 98,765,431
样例输入
3 4
1
0
4
样例输出
26
25
29
提示
40%的数据满足n<=20,k<=2000
solution
通过手模发现
对于第i轮操作
正负由i的奇偶性决定
等比数列求和一下,就是快速幂了
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 50005
#define mod 98765431
using namespace std;
int n;
long long s[maxn],sum;
long long k;
long long lian(long long k,long long num)
{
long long ans=1,p=k;
while(num>0){
if(num&1)ans=ans*p;
p=p*p;p%=mod;ans%=mod;num>>=1;
}
return ans;
}
int main()
{
freopen("oneortwo.in","r",stdin);
freopen("oneortwo.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
scanf("%lld",&s[i]);
sum+=s[i];sum%=mod;
}
long long ny=lian(n,mod-2);
long long a=n-1;
long long tmp=lian(a,k);
if(k&1)tmp++;else tmp--;
long long ans=tmp*ny;ans%=mod;
ans=ans*sum;ans%=mod;
int op;
if(k&1)op=-1;else op=1;
for(int i=1;i<=n;i++){
long long t=ans+s[i]*op;
t=(t%mod+mod)%mod;
printf("%lld\n",t);
}
return 0;
}
最新文章
- Ueditor上传图片后自定义样式类名
- 递归O(NlgN)求解逆序数
- SQL Server死锁
- 为学Linux 我看了这些书
- 尾数为0零BigDecimal不能装成正常数
- 服务器部署_linux下部署jprofiler简单备忘
- DotNet Core 之旅(一)
- 配置.NET程序使用代理进行HTTP请求
- NoSQL简要数据库
- .net Mvc文件下载的功能,大文件下载完成之后修改数据库功能
- 基于python的知乎开源爬虫 zhihu_oauth使用介绍
- AJAX跨域问题解决方法(3)——被调用方解决跨域
- 编译原理 #01# 简易词法分析器(js实现)
- 一个极其简易版的vue.js实现
- mybatis框架之foreach标签
- DDD领域模型查询方法实现(八)
- element UI 导航栏根据路径来确定默认选中
- 基于folly的AtomicIntrusiveLinkedList无锁队列进行简单封装的多生产多消费模型
- vitas高音
- MySQL Study之--MySQL普通用户无法本地登陆