hdu 3049 Data Processing
来源:互联网 发布:java游戏聊斋聂小倩 编辑:程序博客网 时间:2024/06/11 20:58
传送门:这里。
Chinachen is a football fanatic, and his favorite football club is Juventus fc. In order to buy a ticket of Juv, he finds a part-time job in Professor Qu’s lab.And now, Chinachen have received an arduous task——Data Processing.The data was made up with N positive integer (n1, n2, n3, … ), he may calculate the number , you can assume mod N =0. Because the number is too big to count, so P mod 1000003 is instead.Chinachen is puzzled about it, and can’t find a good method to finish the mission, so he asked you to help him.
Input
The first line of input is a T, indicating the test cases number.There are two lines in each case. The first line of the case is an integer N, and N<=40000. The next line include N integer numbers n1,n2,n3… (ni<=N).
Output
For each test case, print a line containing the test case number ( beginning with 1) followed by the P mod 1000003.
Sample Input
231 1 341 2 1 4
Sample Output
Case 1:4Case 2:6
【题意】
给你长度为len的一个数组[a1,,,an],要你求((2^a1+2^a2+…+2^an)/len)%mod。其中题目保证了分子是分母的整数倍。
【分析】
显然是求逆元的过程。以前只是会用板子,今天终于懂了逆元的作用。分析如下:
设x是len关于mod的逆元,那么显然有len*x==1.所以上式可以化简为:
((2^a1+2^a2+…+2^an)/len)%mod = ((2^a1+2^a2+…+2^an)/len*(len*x))%mod = ((2^a1+2^a2+…+2^an)*x)%mod
这样就把一个除法问题转化成了乘法问题,这就是逆元的巧妙之处。然后就是扩展欧几里得的事了,没啥好说的。
【代码】
#include<iostream>#include<cstdio>#include<cstring>#include<string.h>#include<algorithm>#include<vector>#include<cmath>#include<stdlib.h>#include<time.h>#include<stack>#include<set>#include<map>#include<queue>#include<sstream>using namespace std;#define rep0(i,l,r) for(int i = (l);i < (r);i++)#define rep1(i,l,r) for(int i = (l);i <= (r);i++)#define rep_0(i,r,l) for(int i = (r);i > (l);i--)#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)#define MS0(a) memset(a,0,sizeof(a))#define MS_1(a) memset(a,-1,sizeof(a))#define MSinf(a) memset(a,0x3f,sizeof(a))#define MSfalse(a) memset(a,false,sizeof(a))#define inf 0x3f3f3f3f#define lson i<<1,l,mid#define rson ((i<<1)|1),mid+1,r#define uint unsigned inttypedef pair<int,int> PII;#define A first#define B second#define pb push_back#define mp make_pair#define ll long long#define eps 1e-8inline void read1(int &num) { char in; bool IsN=false; in=getchar(); while(in!='-'&&(in<'0'||in>'9')) in=getchar(); if(in=='-') { IsN=true; num=0; } else num=in-'0'; while(in=getchar(),in>='0'&&in<='9') { num*=10,num+=in-'0'; } if(IsN) num=-num;}inline void read2(int &a,int &b) { read1(a); read1(b);}inline void read3(int &a,int &b,int &c){ read1(a); read1(b); read1(c);}inline void read1(ll &num) { char in; bool IsN=false; in=getchar(); while(in!='-'&&(in<'0'||in>'9')) in=getchar(); if(in=='-') { IsN=true; num=0; } else num=in-'0'; while(in=getchar(),in>='0'&&in<='9') { num*=10,num+=in-'0'; } if(IsN) num=-num;}inline void read2(ll &a,ll &b) { read1(a); read1(b);}inline void read3(ll &a,ll &b,ll &c){ read1(a); read1(b); read1(c);}inline void read1(double &num) { char in; double Dec=0.1; bool IsN=false,IsD=false; in=getchar(); while(in!='-'&&in!='.'&&(in<'0'||in>'9')) in=getchar(); if(in=='-') { IsN=true; num=0; } else if(in=='.') { IsD=true; num=0; } else num=in-'0'; if(!IsD) { while(in=getchar(),in>='0'&&in<='9') { num*=10; num+=in-'0'; } } if(in!='.') { if(IsN) num=-num; return ; } else { while(in=getchar(),in>='0'&&in<='9') { num+=Dec*(in-'0'); Dec*=0.1; } } if(IsN) num=-num;}inline void read2(double &a,double &b){ read1(a); read1(b);}inline void read3(double &a,double &b,double &c){ read1(a); read1(b); read1(c);}inline void hdu(void){ srand(time(0)); printf("%d\n",rand()%5217+1000);}///------------------------------------------------------------------------------const int maxm = 4e4+100;const int mod = 1000003;int pow2[maxm];void init(void){ pow2[0] = 1; rep0(i,1,maxm) pow2[i] = (pow2[i-1]<<1)%mod; }int gcd(int a,int b,int &x,int &y){ if (b==0){ x=1,y=0; return a; } int q=gcd(b,a%b,y,x); y-=a/b*x; return q;}int main(void){// freopen("in.txt","r",stdin);// hdu(); int T; init(); read1(T); rep1(nouse,1,T) { printf("Case %d:",nouse); int len,x,y; read1(len); ll ans = 0; rep0(i,0,len) { read1(x); ans = (ans+pow2[x])%mod; } gcd(len,mod,x,y); if(x<0) x+=mod; ans = (ans*x)%mod; printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- HDU 3049 Data Processing
- hdu 3049 Data Processing
- hdu 3049 Data Processing
- hdu 3049 Data Processing(扩展欧几里德求逆元)
- HDU 3049 Data Processing 数论题解
- hdu 3049 Data Processing(扩展欧几里德求逆模)
- HDU 3049 Data Processing(a/b mod c, 逆元)
- hdu - 3049 - Data Processing(乘法逆元)
- hdu 1576 A/B||hdu 3049 Data Processing 乘法逆元
- Data Processing
- hdoj 3049 Data Processing(数学公式法)
- Realtime Data Processing
- SAP DEMO-Processing Data
- Big Data Processing at Easemob – Big Data Processing Platform
- In-Stream Big Data Processing
- In-Stream Big Data Processing
- Data Pre-processing(数据预处理)
- MapReduce: Simplified Data Processing on Large Clusters
- 企业上erp软件有价值?有哪些好用的功能?
- 阿里巴巴将浸没式冷却技术运用到云数据中心
- CS 300 Spanning Trees 构造,生成树
- StretchDIBits用法
- Scatter-gather DMA 与 block DMA
- hdu 3049 Data Processing
- /etc/fstab文件详解
- Android Selector用法
- easyui combobox 隐藏显示,加载取消验证。
- 关于重载、隐藏、重写的一些思考(1)
- mysql触发器
- Squid 3.5安装和配置
- 多行文本超出部分省略号代替
- 【学习】Ionic-页面的跳转