【Luogu】P2220容易题(快速幂)
2024-09-07 19:07:04
这题真是“容易”。呵呵呵。
参考题解:xyz32768
代码
#include<cstdio>
#include<map>
#include<algorithm>
#include<cctype>
#define mod 1000000007
using namespace std;
map<long long,bool> vis;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} inline long long mul(long long a,long long b){
long long ret=;
if(b==) return a;
while(b){
if(b&) ret=(ret+a)%mod;
a=(a+a)%mod;
b>>=;
}
return ret;
} inline long long Pow(long long a,long long b){
long long ret=;
if(b==) return a;
while(b){
if(b&) ret=mul(ret,a);
a=mul(a,a);
b>>=;
}
return ret;
} long long s[]; struct Line{
long long x,y;
bool operator <(const Line &a)const{
if(x!=a.x) return x<a.x;
return y<a.y;
}
}w[];
long long tot;
int main(){
freopen("in.txt","r",stdin);
freopen("out1.txt","w",stdout);
long long n=read(),m=read(),q=read();
long long sum;
if(n&) sum=mul((+n)>>,n);
else sum=mul(+n,n>>);
for(long long i=;i<=q;++i) s[i]=sum;
for(long long i=;i<=q;++i) w[i]=(Line){read(),read()};
sort(w+,w+q+);
for(long long i=;i<=q;++i){
long long x=w[i].x;
if(!vis[x]){
vis[x]=;
tot++;
}
}
long long ans=Pow(sum,m-tot);
for(long long i=;i<=q;++i){
long long d=sum;
long long j;
d-=w[i].y;
for(j=i+;w[j].x==w[j-].x;j++){
if(w[j].y==w[j-].y) continue;
d-=w[j].y;
}
d=(d%mod+mod)%mod;
ans=(ans*d)%mod;
i=j-;
}
printf("%lld",ans);
return ;
}
最新文章
- linux挂着U盘和光盘
- block数据类型
- VC程序查错之内存访问异常
- js添加创建节点和合并节点
- wpf:DataGrid使用
- [饭后算法系列] ";头尾移动"; 排序列表
- QQ邮箱添加公司邮箱步骤
- RT3070 USB WIFI 在连接socket编程过程中问题总结
- [SinGuLaRiTy] 复习模板-数学
- 分布式缓存技术redis学习系列
- 02-oracle中的基础sql
- Python汉诺塔问题
- ARM40-A5应用——fbset与液晶屏参数的适配【转】
- Qt架构图及模块分析介绍
- laravel二维数组手动分页显示
- Java日志 (zhuan)
- (转)C#与Outlook交互收发邮件
- util 常用方法
- code1154 能量项链
- OpenFire通过User Service管理用户