橙白时光 求极限
Problem I: 求极限
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 42 Solved: 11
[Submit][Status][Web Board][Creator:eetze]
Description
小 z 学了一学期的高数了,最近他被一道求极限的题目卡死了,请你帮帮他!给定两个数 a,c。1<=a,c<=1e18。求下列式子的值。结果可能很大,请输出答案模 1e9+7 后的值。
Input
第一行输入一个 T,T<=1000 样例个数。
第二行输入 a,c。
Output
输出答案模 1e9+7 后的值。
Sample Input
2
1 1
1 2
Sample Output
500000005
4
分析:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; import java.util.Arrays; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static long qpom(long x,long y){ long res=1; while(y!=0) { if((y&1)==1)res=res*x;//%mod y >>= 1; x=x*x;//%mod } return res;//%mod } static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); static int nextInt() throws IOException {cin.nextToken();return (int)cin.nval;} static long nextLong() throws IOException {cin.nextToken();return (long)cin.nval;} //这里提交代码要注意输入数据的长度,由于是double转为long类型,虽然double和long都是64位的, //但是double强制转化会有数据超出和越界,记得要用自带输入流,不要用我给出的快读 //https://blog.csdn.net/yangfangjit/article/details/72890779 public static void main(String args[]) throws IOException { Scanner sc=new Scanner(System.in); int time=sc.nextInt(); for(int n=0;n<time;++n) { long a=sc.nextLong(); long c=sc.nextLong(); long mod=1000000000+7; a=a%mod; c=c%mod; long xx=500000004%mod; long res=(((c*c)%mod*xx)%mod+(a*c)%mod)%mod; System.out.println(res); System.out.println(Long.MAX_VALUE); System.out.println(Double.MAX_VALUE); System.out.println(Double.MIN_VALUE); } } }
这道题的方法使用的是逆元,在费马小定理中,a^p%p=a%p,那么a^(p-1)%p=1%p,这个题目的极限最后求出来是一个分数形式,那么分数mod一个极大数结果是什么呢?
将等式左右各除a得到:a^(p-2)%p=(1/a)%p,结果就非常简单了。
代码: