标签:
All X Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1472 Accepted Submission(s): 658 Problem Description F(x,m) 代表一个全是由数字x组成的m位数字。请计算,以下式子是否成立: F(x,m) mod k ≡ c Input 第一行一个整数T,表示T组数据。 每组测试数据占一行,包含四个数字x,m,k,c 1≤x≤9 1≤m≤1010 0≤c<k≤10,000 Output 对于每组数据,输出两行: 第一行输出:"Case #i:"。i代表第i组测试数据。 第二行输出“Yes” 或者 “No”,代表四个数字,是否能够满足题目中给的公式。 Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint 对于第一组测试数据:111 mod 5 = 1,公式不成立,所以答案是”No”,而第二组测试数据中满足如上公式,所以答案是 “Yes”。
分析:
这道题对我来说简直惊艳:
m个x用数学公式表示:[(10^m)-1]/9*x·························@1
所以题目中的问题用数学公式表示:
@1%k=c?
因为/9会产生精度的损失,所以我们把上式两边同时乘以9:
[(10^m)-1)]*x%9k=9*c?···································@2
于是,我们可以用快速幂+取模计算,并得到答案。
这里强调一条性质:(a*b)%c<===>(a%c * b%c) %c
#include<iostream> #include<stdio.h> using namespace std; long long fast_exp(int base,long long exp,int mod) { long long ans=1LL,a=base; while(exp!=0) { if(exp&1LL) ans*=a,ans%=mod; a*=a,a%=mod; exp>>=1; } return ans%mod; } int main() { int t; scanf("%d",&t); int cas=1; while(t--) { int x,k,c; long long m; scanf("%d%I64d%d%d",&x,&m,&k,&c); long long tmp=fast_exp(10,m,0x3f3f3f3f); //cout<<tmp<<endl; long long ans= (fast_exp(10,m,9*k)-1)%(9*k); printf("Case #%d:\n",cas++); if(((ans*x)%(9*k))==c*9) printf("Yes\n"); else printf("No\n"); } }
标签:
原文地址:http://www.cnblogs.com/superxuezhazha/p/5768429.html