题意:已知X,数组arr[n],求一个分式的分子与分母的最大公因数。分子为ΣX^arr[i],分母为X^Σarr[i],数组为不递减序列。

思路:比赛的时候以为想出了正确思路,WA掉了很多发,看了别人写的代码才发现自己漏掉很多细节。

  1.容易想到,分子的最低次幂即可能为所需答案

  2.由于arr里存在相同的数,因此分子的各个幂存在可以合并同类项的情况,所以应该先彻底完成合并同类项,再进行步骤1。

  3.一个小技巧,并不需要完成所有项的合并,当且仅当当前最小项的系数可以被X整除时才需要继续合并,否则当前项的次数即为答案所需次数。

特别需要注意的是:完成合并后,分子的最低次幂的次数是有可能大于分母的次数的,所以应该取二者的较小值作为答案的次数。

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
const int mo=1e9+;
int x;
int mpow(long long xx,long long nn){
long long res=;
while(nn!=){
if(nn&){
res=res*xx%mo;
}
nn>>=;
xx=xx*xx%mo;
}
return res;
} int main(){
int n;
long long num=,arr[];
scanf("%d%d",&n,&x);
for(int i=;i<=n;i++){
scanf("%I64d",&arr[i]);
num+=arr[i];
}
for(int i=;i<=n;i++){
arr[i]=num-arr[i];
}
for(int i=;i<=(n/);i++){
swap(arr[i],arr[n-i+]);
}
int sum=;
long long ans;
arr[n+]=-;
for(int i=;i<=n+;i++){
if(arr[i]==arr[i-]){
sum++;
}
else {
if(sum%x==){
sum/=x;
arr[--i]++;
}
else {
ans=arr[i-];
break;
}
}
}
ans=min(ans,num);
printf("%d",mpow(x,ans));
return ;
}

By xxmlala

最新文章

  1. Html Agility Pack 解析Html
  2. 【目录】本博客其他.NET开源项目文章目录
  3. 数组和链表--Java学习笔记(一)
  4. asp.net GDI+绘制五边形
  5. 大话设计模式C++版——观察者模式
  6. 微軟将从 .NET 4 以后的版本弃用 System.Data.OracleClient 以及Oracle 的各种连接方法
  7. mvc获取时间戳
  8. zookeeper初识之原理
  9. [摘录]quarts:Quartz Quick Start Guide
  10. iOS - 3DTouch 3D 触摸
  11. SQLite之写一个表
  12. tomcat的OutOfMemoryError(PermGen space)解决方法
  13. log4j级别输出
  14. js函数预编译和声明语句被提升问题小结
  15. POJ 3602 Typographical Ligatures
  16. 解决此问题:Oracle 删除用户时报 “必须指定 CASCADE 以删除 &#39;SE&#39;”,
  17. PHP中json_encode与json_decode
  18. webpack 的使用2
  19. Map集合练习题
  20. (2)Python索引和切片

热门文章

  1. 线段树QWQ
  2. redis之哨兵集群
  3. 【转载】Maven安装配置+ GIt&amp;SVN + Jenkins详细配置 软件项目管理 持续集成实验
  4. 一个数据库操作类,适用于Oracle,ACCESS,SQLSERVER
  5. [GIT]比较不同分支的差异
  6. linux下的usb抓包方法
  7. BitmapDrawable
  8. sysbench 压测
  9. vue 调用微信支付方法
  10. nginx和php-fpm 是使用 tcp socket 还是 unix socket ?