数学——大整数问题
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)
代码:
View Code
题目描述 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
相关文章推荐
- 随想杂谈第一004一片:三的博客万人次突破
- 视频教程 安装Win10后电脑没声音该怎么办?
- Tmux使用初体验
- MMD_3b_StreamAlgorithms
- struts1与struts2的对比学习
- 动态网页,注册登陆退出查找排序,9-27
- Difference between WCF and Web API and WCF REST and Web Service
- 图论——生成树
- 用Python组合Celery Redis RabbitMQ进行分布式数据抓取
- 微软:Win10平均每年将会获得两到三次功能性更新
- hdu 1251 统计拼图
- Linux开发环境的搭建和使用——Linux本必备软件SSH
- Training ------ Building Your First App ------ Creating An Android Project
- Win10以后都是累计更新再也不用被一堆补丁烦死了
- cocos-js如何播放cocos studio 上的动画帧
- 采用xshell链路本地虚拟机Linux
- Python namedtuple
- 【UML】面向对象技术
- 静态库、动态链接库详解
- DS-5/RVDS4.0变量初始化错误