Perfect Squares
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 501 Accepted Submission(s): 272
Problem Description
A number x is called a perfect square if there exists an integer b
satisfying x=b^2. There are many beautiful theorems about perfect squares in mathematics. Among which, Pythagoras Theorem is the most famous. It says that if the length of three sides of a right triangle is a, b and c respectively(a < b <c), then a^2 + b^2=c^2.
In this problem, we also propose an interesting question about perfect squares. For a given n, we want you to calculate the number of different perfect squares mod 2^n. We call such number f(n) for brevity. For example, when n=2, the sequence of {i^2 mod 2^n}
is 0, 1, 0, 1, 0……, so f(2)=2. Since f(n) may be quite large, you only need to output f(n) mod 10007.
Input
The first line contains a number T<=200, which indicates the number of test case.
Then it follows T lines, each line is a positive number n(0<n<2*10^9).
Output
For each test case, output one line containing "Case #x: y", where x is the case number (starting from 1) and y is f(x).
Sample Input
2 1 2
Sample Output
Case #1: 2 Case #2: 2
告诉一个数字n,求完全平方数摸2^n有多少不同的结果。没有说完全平方数的范围,想的话应该是循环着的,打表看一看,会发现n分奇数偶数时是有规律的。
n为奇数 2+(4^n-1)/3
n为偶数 2+2/3*(4^(n/2-1)-1)
算除法时分子很大,所以要用到逆元,求逆元的可以参看这篇 点击打开链接
#include <iostream> #include <stdio.h> #include <string> #include <cstring> #include <cmath> #include <algorithm> typedef long long ll; const int mod=10007; using namespace std; ll fun(ll n,ll m) { ll b=1; while(m) { if(m&1) b=b*n%mod; n=n*n%mod; m>>=1; } return b; } int main() { int T; ll n; ll tmp=fun(3,mod-2); scanf("%d",&T); for(int ca=1;ca<=T;ca++) { scanf("%lld",&n); ll ans; if(n%2) { ll t=(fun(4,n/2)-1)%mod; ans=(2+t*tmp%mod)%mod; } else { ll t=(fun(4,n/2-1)-1)%mod; ans=(2+2*t*tmp%mod)%mod; } printf("Case #%d: %lld\n",ca,ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。