您的位置:首页 > 其它

数学——大整数问题

2015-09-27 08:42 393 查看
Wikioi 3285 转圈游戏

题目描述 Description

n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏。按照顺时针方向给 n 个位置编号,从0 到 n-1。最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置,……,依此类推。
游戏规则如下:每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,……,依此类推,第n - m号位置上的小伙伴走到第 0 号位置,第n-m+1 号位置上的小伙伴走到第 1 号位置,……,第 n-1 号位置上的小伙伴顺时针走到第m-1 号位置。
现在,一共进行了 10^k 轮,请问 x 号小伙伴最后走到了第几号位置。

输入描述 Input Description

输入共 1 行,包含 4 个整数 n、m、k、x,每两个整数之间用一个空格隔开。

输出描述 Output Description

输出共 1 行,包含 1 个整数,表示 10^k 轮后 x 号小伙伴所在的位置编号。

样例输入 Sample Input

10 3 4 5

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

对于 30%的数据,0 < k < 7;
对于 80%的数据,0 < k < 10^7;
对于 100%的数据,1 < n < 1,000,000,0 < m < n,1 <= x <=n,0 < k < 10^9。

思路:
游戏结束后x号的位置是(x + m*10^k) % n,其中10^k使用快速幂,原理就是10^m * 10^n = 10^(m+n)
代码:

#include<cstdio>
#include<iostream>
using namespace std;
const int maxn =400020;
struct edge{
int next;
int to;
int power;
};
edge test[maxn];
int head[maxn],cur = 0,n,j[maxn],p[maxn],max1[maxn],max2[maxn],nmax1[maxn],coun[maxn];
long long int vall = 0,vmax = 0,sub =0;

int use(int i)
{
int t=head[i];
int ti,tmp,sum=0,cha2=0;

while (t!=-1)
{    ti=test[t].to;
sum=(sum+p[ti]%10007)%10007;
cha2+=p[ti]*p[ti]%10007;
if (p[ti]>max1[i] )
{ max1[i]=p[ti];
nmax1[i]=ti;
}
t=test[t].next;
coun[i]++;

}
sum=(sum*sum%10007 +10007-cha2%10007)%10007;
vall+=sum%10007;
return sum;
}

/*int dfs(int deep,int last,int now){
if(deep == 2){
if(last == now) return 0;
int temp;
temp =  p[now]* p[last];
if(temp > vmax) vmax = temp;
return 0;
}

for(int k=head[now];k>-1;k=test[k].next){
dfs(deep + 1,last,test[k].to);
}
} */
void dfs(int i)
{  int ansi=1;
if (coun[i]>1)
{
int t=head[i];
int ti;
while (t!=-1)
{
ti=test[t].to;
if (ti!=nmax1[i] )
{
if  (p[ti]>max2[i] )
max2[i]=p[ti];}
t=test[t].next;
}
}
if (vmax<max1[i]*max2[i] ) vmax=max1[i]*max2[i];

}

void add(int u,int v,int w){
test[cur].power = w;
test[cur].to = v;
test[cur].next = head[u];
head[u] = cur++;
}
int main(){
cin>>n;
int u,v,w;
for(int i = 0;i < n;i++){
test[i].power = 1;
test[i].next = -1;
head[i] = -1;
j[i] = 1;
}
int tu,tv;
for(int i = 0;i < n-1;i++){
cin>>tu>>tv;
tu--;
tv--;
add(tu,tv,1);
add(tv,tu,1);

}
for(int i = 0;i < n;i++) cin>>p[i];

for(int i = 0;i < n;i++)use(i);
for(int i = 0;i < n;i++)dfs(i);
cout<<vmax<<" "<<vall % 10007<<endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: