ZOJ 3785 What day is that day?(取模演算)
ZOJ 3785 What day is that day?(取模运算)
What day is that day?
Time Limit: 2 Seconds
Memory Limit: 65536 KB
周日做了浙江ACM省赛一个有关模运算的题。
It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days?
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:
There is only one line containing one integer N (1 <= N <= 1000000000).
Output
For each test case, output one string indicating the day of week.
Sample Input
2 1 2
Sample Output
Sunday Thursday
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3785
拿到这个题我就向取模上走了!
然后我就开始找规律,我是想1到n的n次方 1 ,2的2次方,3的3次方,4的4次方,5的5次方,6的6次方,7的7次方(因为要与7取模,所以为0的7次方),8的8次方(等于1的8次方)以此类推。第一个2的2次方和第二个2的9次方(也就是9的9次方)这样中间差 2的7次方,每个数都是这样。在下文中我用a记录了1-7的7次方%7的余数,
至于sum2,sum3 等这些是我找的规律,就是这些数一个循环 。 代码很简单。
#include<iostream> #include<stdio.h> using namespace std; int a[8]={0,1,4,6,4,3,1,0}; int sum2[4]={0,4,5,0}; int sum3[7]={0,6,3,1,2,5,0}; int sum4[4]={0,4,6,0}; int sum5[7]={0,3,4,2,6,5,0}; int sum6[3]={0,1,0}; char week[7][10]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"}; int main() { int cases ; cin>>cases; while(cases--) { long n; cin>>n; long period=n/7;//周期数 int re =n%7;//出去周期后还剩几天 int sum =0; long sum22=0,sum33=0,sum44=0,sum55=0,sum66=0; if(re>0) { sum =(period+1)%7; re--; } else sum=period%7; if(re>0) { sum22=sum2[(period+1)%3];//%后面的当前nn对应的周期数 re--; } else sum22=sum2[(period)%3]; if(re) { sum33 =sum3[(period+1)%6]; re--; } else sum33 =sum3[period%6]; if(re) { sum44 = sum4[(period+1)%3]; re--; } else sum44 = sum4[period%3]; if(re) { sum55 = sum5[(period+1)%6]; re--; } else sum55 = sum5[period%6]; if(re) { sum66 = sum6[(period+1)%2]; re--; } else sum66 = sum6[period%2]; sum+=sum22+sum33+sum44+sum55+sum66; printf("%s\n",week[sum%7]); } }这是我的想法,可能有点费劲,也没有上网看看大神解题报告。
可能是让我做复杂了。
好了!本来想写总结取模的运算呢!没时间了。
明天再来写取模总结。
好了!
感谢自己坚持!