HDU 4569 長沙E題 枚舉
題意:給你函數 f(x) = anxn +...+ a1x +a0 最多N就4位,輸入任意一個x使f(x)%(prime*prime)=0。
這題枚舉就可以,首先如果滿足f(x)%(prime*prime)=0必須要滿足f(x)%prime=0這個條件。
那麼應該先找到一個x滿足f(x)%prime=0,然後在(x-prime*prime)區間內x+=prime(保證f(x)%prime=0總成立),如果有f(x)%(prime*prime)=0那麼就輸出。
找出一個x在(0-prime)區間內找,找到後不斷加prime,所以這樣找在區間(1-prime*prime)內所有的x滿足f(x)%prime=0都找出來了。
對於任意一個大於pri*pri的數n,我們都可以將其成寫n=(pri*pri)*t+k的形式,其中t為整數,k<=pri*pri;那麼f(pri*pri*t+k)的值就相當於在f(k)的值的基礎上增加了pri*pri的倍數;所以若f(k)%pri*pri==0不成立,則f(pri*pri*t+k)%pri*pri==0也不會成立;因此若在1到pri*pri之間不能找到一個x使得f(x)%pri*pri==0成立,那麼就不存在一個x使得f(x)%pri*pri==0成立
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long a[10]; long long getf(long long x,int n) { long long sum=0; for(int i=0; i<n; i++) sum+=a[i],sum*=x; return sum+a[n]; } void solve(int n,long long pri) { long long i,j,mod=pri*pri; for(i=0; i<pri; i++) if(getf(i,n)%pri==0) for(j=i; j<mod; j+=pri) if(getf(j,n)%mod==0) { printf("%I64d\n",j); return; } puts("No solution!"); } int main() { int t,n,ca=0; long long pri; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0; i<n+1; i++) scanf("%I64d",&a[i]); scanf("%I64d",&pri); printf("Case #%d: ",++ca); solve(n,pri); } return 0; }
最後更新:2017-04-03 18:52:14
上一篇:
數據結構開場白
下一篇:
1602顯示時鍾可以調節時分秒(加減)
為什麼要把jsp放在WEB-INF目錄下
線程同步之Semaphore
Oracle Partition 分區詳細總結
nagios報錯:.stdio.h4561 error 'gets' undeclared here (not in a function)
2017年杭州雲棲大會容器技術專場我們不見不散~
《Servlet、JSP和Spring MVC初學指南》——2.4 HttpSession對象
XML的操作——JAXB進行Java對象和XML之間的轉換
《Netty 實戰》Netty In Action中文版 第2章——你的第一款Netty應用程序(一)
淘點點如何輕鬆實現整套O2O類搜索解決方案?
雲交易K線技巧?中國雲交易2017排行!