您的位置:首页 > 编程语言 > C语言/C++

UVALive - 7720 The 2016 ACM-ICPC Asia Jakarta Regional Contest J - Super Sum

2017-10-22 23:44 429 查看
第二题。。 更惨的第四发才a。。
一开始这题居然把三个人都看懵了。
仔细一看发现就是求很多个等比数列的和然后相乘。。注意取模和逆元。。wa的很惨啊。
#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)
#define W(t) while(t)
#define MEM(a,b) memset(a,b,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
#define MAXN 2500010
#define eps 1e-10
#define COUT(x) cout<<x<<endl
using namespace std;
const ll mod=1000000007;
ll quick(ll n,ll m)
{
ll ans=1;
while(m)
{
if(m&1)
ans=ans*n%mod;
m>>=1;
n=n*n%mod;
}
return ans;
}
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0){x=1,y=0;return a;}
else{ll q=exgcd(b,a%b,y,x);y=y-x*(a/b);return q;}
}
ll niyuan(ll a,ll n)
{
ll x,y;
ll d=exgcd(a,n,x,y);
if(d==1)
return (x%n+n)%n;
else
{
return -1;
}

}
int main()
{
int t,ca=1;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
ll ans=1,a,b,c;
for(int i=0;i<n;i++)
{
scanf("%lld%lld%lld",&a,&b,&c);
ll s;
if(a==1&&c==b)
s=1;
else if(a==1&&c!=b)
s=c-b+1;
else
s=(quick(a,c)*a-quick(a,b)+mod)%mod*niyuan(a-1,mod)%mod;
ans=ans*s%mod;
}
printf("Case #%d: %lld\n",ca++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 acm-icpc
相关文章推荐