日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HDU1582 HDU1452 HDU1098 HDU3524 HDU1005 HDU2623 HDU2674】

發布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HDU1582 HDU1452 HDU1098 HDU3524 HDU1005 HDU2623 HDU2674】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:求2008^n的所有因子和對k取余,得到m,然后在求2008^m對給出的k取余。k是任意數(k>0)
分析:
? ? 1. 用素因子唯一分解定理,對2008分解。
? ? 2. 素因子求和公式之后得到m
? ? 3. 因為要(a*b/250)%k 對于給定的k和250不確定是否互質,所以不能用求逆元的方法
? ? 4. 公式a/b%k=a%(b*k)/b
? ? 5. 快速冪求解最終結果.

K未知,gcd(K,250)不一定為1,不能用求逆元的方法,
但是加了一個判斷就一直TLE,就這么卡時間?
TLE:

#include <bits/stdc++.h> using namespace std; typedef long long ll; #define X 10005 #define inf 0x3f3f3f3f #define PI 3.141592653589793238462643383 int K; const int N = 100000 + 5; ll n,k,a,b,m,mod; ll Pow(ll a,ll b) {ll ans=1;while(b){if(b&1){ans=(ans*a)%mod;}b>>=1;a=(a*a)%mod;}return ans; } int main() {while(~scanf("%lld%lld",&n,&k)){if(n==0&&k==0){break;}mod=k*250;a=Pow(2,3*n+1)-1;b=Pow(251,n+1)-1;m=(a*b)%(250*k)/250;mod=mod/250;printf("%d\n",Pow(2008,m));}return 0; }

正解:

#include <bits/stdc++.h> using namespace std; typedef long long ll; #define X 10005 #define inf 0x3f3f3f3f #define PI 3.141592653589793238462643383 int K,mod; ll Pow(int a,int b) {ll ans=1;while(b){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;b>>=1;}return ans%mod; } void e_gcd(int a,int b,int &d,int &x,int &y) {if(!b)d=a,x=1,y=0;elsee_gcd(b,a%b,d,y,x),y-=a/b*x; } ll inv(ll a,ll m) {int d,x,y;e_gcd(a,m,d,x,y);return d==1?(x+m)%m:-1; } int main() {ios::sync_with_stdio(false);int N;while(cin>>N>>K){if(N==K&&K==0)break;ll a,b;ll c=inv(250,K),m;if(c==-1){mod=K*250;a=Pow(2,3*N+1)-1;b=Pow(251,N+1)-1;m=((a*b)%(K*250))/250;mod/=250;printf("%d\n",Pow(2008,m));}else{mod=K;a=Pow(2,3*N+1)-1,b=Pow(251,N+1)-1;m=a*b*c%K;cout<<Pow(2008,m)<<endl;}}return 0; }

HDU1452

題意:求2004^x的所有因子和對29取余的結果。
和hdu 1852一樣

? 在(a/b)%p的時候
(a/b)%p=(a/b)-(a/b/p)*p
? ? ? ?=(a/b)-(a/(b*p)*p)
? ? ? ?=(a/b)-(a/(b*p)*(b*p)/b)
? ? ? ?=(a%(b*p))/b

? ? ? ? ? ? ? ? ? ? ? ? A[i] = -(p / i) * A[p % i];
對b進行求解逆元的的充要條件是b和模數m互質gcd(b,m)=1,
設c為b的逆元:bc≡1 mod p (bc+kp=1):bc對p取余為1(p>1)
?a/b%p=a/b*1=(a/b)*bc mod p=ac mod p
解釋為:除以一個數對p取模等于乘以這個數的逆元對p取模
?c=inv(b)

#include <bits/stdc++.h> using namespace std; typedef long long ll; int mod=29; ll Pow(int x,int n) {ll ans=1;while(n){if(n&1)ans=(ans*x)%mod;x=(x*x)%mod;n>>=1;}return ans; } void e_gcd(int a,int b,int &d, int &x,int &y) {if(!b)d=a,x=1,y=0;elsee_gcd(b,a%b,d,y,x),y-=a/b*x; } int inv(int a,int m) {int d,x,y;e_gcd(a,m,d,x,y);return d==1?(x+m)%m:-1; } int main() {ll x;while(scanf("%lld",&x)&&x){ll a=Pow(2,2*x+1)-1,b=Pow(3,x+1)-1,c=Pow(167,x+1)-1;//在函數名稱上找bug找了半小時powcout<<(a*b*c*inv(2*166,mod))%mod<<endl;;}return 0; }

HDU1098
?

? ?f(x)=5*x^13+13*x^5+k*a*x 對給定的k,找到最小的a使得任意的x都%65=0成立
? 那么逆思維 對于f(1) 不管a是不是最小,那么是一定成立的,則(18+ka)%65=0
?在根據這個公式找出最小的 a ,
? ? 這道題很有趣的思維是 關于取余的一個循環 (18%65 + ka % 65 )%65
? ? 當 a=66的時候 又會出現 (18%65 + ka % 65 )%65 ,說明存在一個循環節
?

#include <bits/stdc++.h> #define X 10005 #define inF 0x3f3f3f3f #define PI 3.141592653589793238462643383 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; typedef long long ll; const int N = 1e4; const int Times=10; int main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int k;while(cin>>k){int i=1;int ans=18%65;for( i=1;i<66;++i){if((ans+k*i)%65==0){cout<<i<<endl;break;}}if(i==66)cout<<"no"<<endl;}return 0; }

HDU3524

求:i^2%2^n有多少種不同結果
?

#include <bits/stdc++.h> using namespace std; typedef long long ll; #define X 10005 #define inf 0x3f3f3f3f #define one 0x01 #define PI 3.141592653589793238462643383 const int N=1e4; int mod=3*10007; ll f[N]; ll Pow(int a,int n) {ll ans=1;while(n){if(n&1){ans=ans*a%mod;}a=a*a%mod;n/=2;}return ans%mod; } int main() {ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int t;ll n;cin>>t;for(int m=1;m<=t;++m){cin>>n;ll ans,te;if(n&1){te=(n+1)/2;te--;ans=( (Pow(4, te )%mod+5) % mod )/ 3;//ans=( (Pow(4, te%(mod-1) )%mod+5) % mod )/ 3; 本來還想著用費馬小定理進行降冪運算,可是3*100007不是素數}else{te=n/2-1;ans=( (2*Pow(4, te )+4) % mod )/ 3;//ans=( (Pow(4, te%(mod-1) )%mod+5) % mod )/ 3;}cout<<"Case #"<<m<<": "<<ans<<endl;}return 0; } /*得到的前十五項是:2 2 3 4 7 12 23 44 87 172 343 684 1367 1824發現奇數項的差分別是 1 4 16 64 256 1024發現偶數項的差分別是 2 8 32 128 512奇數項 A(n)=4*A(n-1)-5 => (4^(n-1)+5)/3偶數項 B(n)=4*B(n-1)-4 => (2*4^(n-1)+4)/3遞推,但不是O(1)規律: an = 2an-1 -1 奇數 an = 2an-1 -2 偶數 1 2 2 2 4 2 3 8 3 4 16 4 5 32 7 6 64 12 7 128 23 8 256 44 9 512 87 10 1024 172 11 2048 343 12 4096 684 13 8192 1367 */ ///i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 ///ai 1 2 2 3 4 7 12 23 44 87 172 343 684 1367 /// 1 2 4 8 16 32 64 128

HDU1005?

A number sequence is defined as follows:?
f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.?
Given A, B, and n, you are to calculate the value of f(n).?
Input
The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.?
Output
For each test case, print the value of f(n) on a single line.?
Sample Input
1 1 3
1 2 10
0 0? 0
Sample Output
2?
5

一道矩陣快速冪的題:

遞推:? ? ? ? ? ? ? ? ? ? ?| A ?1|
(fn,fn-1)=(fn-1,fn-2)?|? ? ? ?|
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| B ?0|
? ? ? ? ? ? ? ? ? ? ? ?| A ?1|
最后fn=(f1,f2)*|? ? ? ? |? ? ?^(n-2)
? ? ? ? ? ? ? ? ? ? ? ? | B ?0|
?

#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() {int A,B;ll n;int a[100]={1,1},t;while(scanf("%d%d%lld",&A,&B,&n),A||B||n){int i;for( i=2;i<50;++i)//這個50換成100竟然wa,不知道數據怎么設置的{a[i]=(A*a[i-1]+B*a[i-2])%7;if(a[i]==1&&a[i-1]==1){break;}}int t=i-2+1;printf("%d\n",n%t==0?a[t-1]:a[n%t-1]);}return 0; }

HDU2623?
題意:給你n和k,求

? ? 和等于: k-1*(k/1)+(k-2*(k/2))+(k-3*(k/3))+......(k-n*(k/n))
? ? ? ? ? ? =kn-(1*(k/1)+(2*(k/2))+3*(k/3)+......k*(k/n))

? ? 看 :k/1 k/2 k/3 k/4 k/5 k/6........k/n

對區間分塊:
? ? ? ? ?i ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ? ..... ?n
k=11 d=k/i 11 ?5 ?3 ?2 ?2 ?1 ?1 ?1
number=k/d ?1 ?2 ?3 ?5 ?5 ?11 11 ?11 .....
number代表的就是當前d值相同的最后一個區間
?

#include <bits/stdc++.h> using namespace std; typedef long long ll; #define X 10005 #define inf 0x3f3f3f3f #define one 0x01 #define PI 3.141592653589793238462643383 const int N=1e6; int mod=2009; ll f[N]; int main() {ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n ,k;while(cin>>n>>k){ll sum=n*k;ll len=min(n,k);///n<k 算到n k<n 算到kll ans=0;for(int i=1;i<=len;++i){ll d=k/i;ll number=k/d;if(number>len)number=len;// cout<<i<<' '<<d<<' '<<number<<' '<<(d*(i+number)*(number-i+1)/2)<<endl;ans+=(d*(i+number)*(number-i+1)/2);i=number;}cout<<sum-ans<<endl;}return 0; }

HDU2136
題目大意:求一個數的最大素數因子在素數序列中排第幾。
總結:Everybody knows any number can be combined by the prime number.每個數都可以由一個素數結合起來(素數本身由自己和1組成,質數則可由一個素數和其他的數乘積得到
每個數都可以由一個若干個素數組成
T:

#include<bits/stdc++.h> const int N=1000000; using namespace std;int primer[N],po[N],cnt=0; int main() {po[cnt++]=1;for(int i=2;i<N;++i){if(!primer[i]){po[cnt++]=i;for(int j=i*2;j<N;j+=i){primer[j]=1;}}}int n;while(~scanf("%d",&n)){for(int i=n;i>=0;--i){if(po[i]<=n)//po[n]>n{if(n%po[i]==0){printf("%d\n",i);break;}}}}return 0; }

正解:
?

#include<bits/stdc++.h> const int N=1e6; using namespace std;int primer[N],cnt=0; int main() {for(int i=2;i<N;++i){if(!primer[i]){primer[i]=++cnt;for(int j=2*i;j<N;j+=i){primer[j]=cnt;}}}int n;while(~scanf("%d",&n)){printf("%d\n",primer[n]);}return 0; }

HDU 2674?
計算的是N!%2009,0<=N<=10^9。

蒙,打個表,n>40 都是0

正解:
考察的是 mod=2009的質因數
2009=7*7*41 所以n=7的時候就差個41想乘取模就為0 所以到41取模就為0

#include <bits/stdc++.h> using namespace std; typedef long long ll; #define X 10005 #define inf 0x3f3f3f3f #define one 0x01 #define PI 3.141592653589793238462643383 const int N=1e6; int mod=2009; ll f[N]; int main() {ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);f[0]=1;for(int i=1;i<=40;++i){f[i]=(i*f[i-1])%mod;// cout<<i<<' '<<f[i]<<endl;}// cout<<41*245%2009<<endl;ll n;while(cin>>n){if(n<41)cout<<f[n]<<endl;elsecout<<0<<endl;}return 0; }

?

總結

以上是生活随笔為你收集整理的【HDU1582 HDU1452 HDU1098 HDU3524 HDU1005 HDU2623 HDU2674】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。