zoj 3785 What day is that day?
2014-04-15 19:50
561 查看
题意:求1^1+2^2+3^3+4^4+....对7取模
分析:先把底数对7取模,得出1^1+1^8+1^15+...+2^2+2^9+2^16+...
然后就可以分成7组,分别用矩阵加速计算结果,关键就在矩阵的构造了
结果右上角的就是答案,其中n为底为i的项的个数
分析:先把底数对7取模,得出1^1+1^8+1^15+...+2^2+2^9+2^16+...
然后就可以分成7组,分别用矩阵加速计算结果,关键就在矩阵的构造了
结果右上角的就是答案,其中n为底为i的项的个数
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<cmath> using namespace std; char s[7][20]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"}; struct Matrix { int a[2][2]; }; Matrix multiply(Matrix x,Matrix y){ int i,j,k; Matrix ret; for(i=0;i<2;i++){ for(j=0;j<2;j++){ ret.a[i][j]=0; for(k=0;k<2;k++){ ret.a[i][j]+=(x.a[i][k]*y.a[k][j])%7; ret.a[i][j]%=7; } } } return ret; } void quick_pow(Matrix &ans,Matrix &tmp,int y){ while(y){ if(y&1){ ans=multiply(ans,tmp); } tmp=multiply(tmp,tmp); y>>=1; } } int power(int x,int y){ int ret=1; while(y){ if(y&1) ret=ret*x%7; x=x*x%7; y>>=1; } return ret; } int main() { Matrix tmp,ans; int t,n,sum,i,c,num; scanf("%d",&t); while(t--){ scanf("%d",&n); sum=0; for(i=1;i<=7;i++){ ans.a[0][0]=ans.a[0][1]=power(i,i)%7; ans.a[1][0]=ans.a[1][1]=0; tmp.a[0][0]=tmp.a[0][1]=power(i,7)%7; tmp.a[1][0]=0;tmp.a[1][1]=1; num=n/7; if(n%7>=i) num++; if(num>0){ num--; quick_pow(ans,tmp,num); sum=(sum+ans.a[0][1])%7; } } printf("%s\n",s[sum]); } return 0; }
相关文章推荐
- MongoDB学习之旅十三:MongoDB 导入导出
- [物理学与PDEs]第5章第1节 引言
- C++学习之友元类和友元函数
- 0415总结
- leetcode-Remove Duplicates from Sorted List(2014.2.4)
- Kinect体感开发书籍汇总
- JAVA中String与StringBuffer的区别
- opencv对摄像头采集视频的几种变换
- 安卓UDP接收广播数据
- 新手如何准确的控制油门
- 深入分析Java ClassLoader原理
- DM3730学习日记-写在前面
- 56.阶乘因式分解
- week 8.1
- Java利用OpenOffice将word等office文档转换成PDF
- Implementation:Dijkstra
- lua -- 点击关闭窗口中的子界面
- where would you go this weekend?...
- iPhone截图两种方法介绍
- 第六周作业